<?php
/**
 * Extension Abstract
 *
 * @package NotificationX\Extensions
 */

namespace NotificationX\Types;

use NotificationX\Core\Rules;
use NotificationX\Types\Traits\Conversions;
use NotificationX\Types\Traits\Reviews;
use NotificationX\Extensions\GlobalFields;
use NotificationX\GetInstance;
use NotificationX\NotificationX;

/**
 * Extension Abstract for all Extension.
 * @method static WooCommerce get_instance($args = null)
 */
class WooCommerceSales extends Types {
    /**
     * Instance of Admin
     *
     * @var Admin
     */
	use GetInstance;
    use Reviews;
    use Conversions;

    // colored_themes
    public $priority = 5;
    public $themes = [];
    public $res_themes = [];
    public $module = [
        'modules_woocommerce',
        'modules_woocommerce_sales_reviews',
        'modules_woocommerce_sales_inline',
    ];
    
    public $map_dependency = [];

    public $default_source    = 'woocommerce_sales';
    // public $default_theme = 'woocommerce_theme-one';
    public $link_type = 'product_page';

    /**
     * Initially Invoked when initialized.
     */
    public function __construct(){
        parent::__construct();
        $this->id = 'woocommerce_sales';
    }

    public function init() {
        parent::init();
        $this->title = __('WooCommerce', 'notificationx');

        $is_pro = ! NotificationX::is_pro();
        // nx_colored_themes
        $common_fields = [
            'first_param'         => 'tag_name',
            'custom_first_param'  => __('Someone' , 'notificationx'),
            'second_param'        => __('just purchased', 'notificationx'),
            'third_param'         => 'tag_product_title',
            'custom_third_param'  => __('Anonymous Product', 'notificationx'),
            'fourth_param'        => 'tag_time',
            'custom_fourth_param' => __( 'Some time ago', 'notificationx' ),
        ];
        // Theme order mirrors includes/Types/Conversions.php so the Sales
        // Notification and WooCommerce theme grids stay in sync.
        $this->themes = [
            'theme-one'   => [
                'source' => NOTIFICATIONX_ADMIN_URL . 'images/extensions/themes/nx-conv-theme-2.jpg',
                'image_shape' => 'square',
                'template'  => $common_fields,
            ],
            // Figma "theme-one" — circular avatar, name row, action+product+time row,
            // green "Verified by NotificationX" badge (branding) + right-aligned "Buy now" link.
            'conv-theme-twelve' => array(
                'source' => NOTIFICATIONX_ADMIN_URL . 'images/extensions/themes/nx-conv-theme-12.png',
                'image_shape' => 'circle',
                'template'  => $common_fields,
                'defaults'     => [
                    'link_button'      => true,
                    'link_button_text' => __( 'Buy now', 'notificationx' ),
                ],
            ),
            // Figma "theme-two" — floating "Buy now" pill above top-right, rounded-square
            // avatar, row 1 = name + right-aligned time, row 2 = "Bought <product>",
            // green "Verified by NotificationX" badge.
            'conv-theme-thirteen' => array(
                'source' => NOTIFICATIONX_ADMIN_URL . 'images/extensions/themes/nx-conv-theme-13.png',
                'image_shape' => 'rounded',
                // Row 2 reads "Bought <product>" per the design (the shared default
                // is "just purchased"), so override the action verb for this theme.
                'template'  => array_merge( $common_fields, [
                    'second_param' => __( 'Bought', 'notificationx' ),
                ] ),
                'defaults'     => [
                    'link_button'      => true,
                    'link_button_text' => __( 'Buy now', 'notificationx' ),
                ],
            ),
            // Figma "theme-four" — left lavender image panel with a check badge, floating
            // "Buy now" pill above top-right, row 1 = time (top-right), row 2 = name +
            // action + product, green "Verified by NotificationX" badge.
            'conv-theme-fifteen' => array(
                'source' => NOTIFICATIONX_ADMIN_URL . 'images/extensions/themes/nx-conv-theme-15.png',
                'image_shape' => 'rounded',
                'template'  => $common_fields,
                'defaults'     => [
                    'link_button'      => true,
                    'link_button_text' => __( 'Buy now', 'notificationx' ),
                ],
            ),
            'theme-two'   => [
                'source' => NOTIFICATIONX_ADMIN_URL . 'images/extensions/themes/nx-conv-theme-1.jpg',
                'image_shape' => 'square',
                'template'  => $common_fields,
            ],
            'theme-three' => [
                'source' => NOTIFICATIONX_ADMIN_URL . 'images/extensions/themes/nx-conv-theme-3.jpg',
                'image_shape' => 'square',
                'template'  => $common_fields,
            ],
            'theme-five' => array(
                'source' => NOTIFICATIONX_ADMIN_URL . 'images/extensions/themes/pro/nx-conv-theme-five.png',
                'image_shape' => 'circle',
                'template'  => $common_fields,
            ),
            'theme-four' => array(
                'is_pro' => true,
                'source' => NOTIFICATIONX_ADMIN_URL . 'images/extensions/themes/pro/nx-conv-theme-four.png',
                'image_shape' => 'circle',
                'template'  => $common_fields,
            ),
            // @todo pro map theme
            'conv-theme-six' => array(
                'is_pro' => true,
                'source' => NOTIFICATIONX_ADMIN_URL . 'images/extensions/themes/pro/nx-conv-theme-6.jpg',
                'image_shape' => 'circle',
            ),
            // @todo pro map theme
            'maps_theme' => array(
                'is_pro' => true,
                'source' => NOTIFICATIONX_ADMIN_URL . 'images/extensions/themes/pro/maps-theme.png',
                'image_shape' => 'square',
                'show_notification_image' => 'maps_image',
            ),
            'conv-theme-ten' => array(
                'is_pro' => true,
                'source' => NOTIFICATIONX_ADMIN_URL . 'images/extensions/themes/nx-conv-theme-4.png',
                'image_shape' => 'rounded',
                'defaults'     => [
                    'link_button'   => true,
                ],
                'template'  => $common_fields,
            ),
            'conv-theme-eleven' => array(
                'is_pro' => true,
                'source' => NOTIFICATIONX_ADMIN_URL . 'images/extensions/themes/nx-conv-theme-5.png',
                'image_shape' => 'rounded',
                'defaults'     => [
                    'link_button'   => true,
                ],
                'template'  => $common_fields,
            ),
            // Figma "theme-three" — sales-count card (cart icon, "X Buyers purchased /
            // in last N days / Purchase now" + verified badge). Pro aggregates the count.
            'conv-theme-fourteen' => array(
                'is_pro' => true,
                'source' => NOTIFICATIONX_ADMIN_URL . 'images/extensions/themes/nx-conv-theme-14.png',
                'image_shape' => 'rounded',
                'defaults'    => [
                    'link_button'      => true,
                    'link_button_text' => __( 'Purchase now', 'notificationx' ),
                ],
            ),
            // Figma "theme-five" — sales-count card, alternate layout (badge on top,
            // blue cart box, floating "Purchase now" pill). Same Pro count engine.
            'conv-theme-sixteen' => array(
                'is_pro' => true,
                'source' => NOTIFICATIONX_ADMIN_URL . 'images/extensions/themes/nx-conv-theme-16.png',
                'image_shape' => 'rounded',
                'defaults'    => [
                    'link_button'      => true,
                    'link_button_text' => __( 'Purchase now', 'notificationx' ),
                ],
            ),
            'conv-theme-seven' => array(
                'is_pro' => true,
                'source' => NOTIFICATIONX_ADMIN_URL . 'images/extensions/themes/pro/nx-conv-theme-7.png',
                'image_shape' => 'rounded',
            ),
            'conv-theme-eight' => array(
                'is_pro' => true,
                'source' => NOTIFICATIONX_ADMIN_URL . 'images/extensions/themes/pro/nx-conv-theme-8.png',
                'image_shape' => 'circle',

            ),
            'conv-theme-nine' => array(
                'is_pro' => true,
                'source' => NOTIFICATIONX_ADMIN_URL . 'images/extensions/themes/pro/nx-conv-theme-9.png',
                'image_shape' => 'rounded',
            ),
        ];
        $this->res_themes = [
            'res-theme-one'   => [
                'source'    => NOTIFICATIONX_ADMIN_URL . 'images/extensions/themes/res_conv/nx-conv-res-theme-1.png',
                '_template' => 'woo_template_new',
                'is_pro'    => true,
            ],
            'res-theme-two'   => [
                'source'    => NOTIFICATIONX_ADMIN_URL . 'images/extensions/themes/res_conv/nx-conv-res-theme-2.png',
                '_template' => 'woo_template_new',
                'is_pro'    => true,
            ],
            'res-theme-three'   => [
                'source'    => NOTIFICATIONX_ADMIN_URL . 'images/extensions/themes/res_conv/nx-conv-res-theme-3.png',
                '_template' => 'woo_template_new',
                'is_pro'    => true,
            ],
            'res-theme-four'   => [
                'source'    => NOTIFICATIONX_ADMIN_URL . 'images/extensions/themes/res_conv/nx-conv-res-theme-4.png',
                '_template' => 'woo_template_new',
                'is_pro'    => true,
            ],
            'res-theme-five'   => [
                'source'    => NOTIFICATIONX_ADMIN_URL . 'images/extensions/themes/res_conv/nx-conv-res-theme-5.png',
                '_template' => 'maps_template_new',
                'is_pro'    => true,
            ],
            'res-theme-six'   => [
                'source'    => NOTIFICATIONX_ADMIN_URL . 'images/extensions/themes/res_conv/nx-conv-res-theme-6.png',
                '_template' => 'maps_template_new',
                'is_pro'    => true,
            ],
            'res-theme-seven'   => [
                'source'    => NOTIFICATIONX_ADMIN_URL . 'images/extensions/themes/res_conv/nx-conv-res-theme-7.png',
                '_template' => 'woo_template_new',
                'is_pro'    => true,
            ],
            'res-theme-eight'   => [
                'source'    => NOTIFICATIONX_ADMIN_URL . 'images/extensions/themes/res_conv/nx-conv-res-theme-8.png',
                '_template' => 'woo_template_new',
                'is_pro'    => true,
            ],
            'res-theme-nine'   => [
                'source'    => NOTIFICATIONX_ADMIN_URL . 'images/extensions/themes/res_conv/nx-conv-res-theme-9.png',
                '_template' => 'woo_template_sales_count',
                'is_pro'    => true,
            ],
            'res-theme-ten'   => [
                'source'    => NOTIFICATIONX_ADMIN_URL . 'images/extensions/themes/res_conv/nx-conv-res-theme-10.png',
                '_template' => 'woo_template_sales_count',
                'is_pro'    => true,
            ],
            'res-theme-eleven'   => [
                'source'    => NOTIFICATIONX_ADMIN_URL . 'images/extensions/themes/res_conv/nx-conv-res-theme-11.png',
                '_template' => 'woo_template_sales_count',
                'is_pro'    => true,
            ],
        ];
        $this->templates = [
            'woo_template_new' => [
                'first_param' => GlobalFields::get_instance()->common_name_fields(),
                'third_param' => [
                    'tag_product_title' => __('Product Title', 'notificationx'),
                ],
                'fourth_param' => [
                    'tag_time' => __('Definite Time', 'notificationx'),
                ],
                '_themes' => [
                    'woocommerce_sales_theme-one',
                    'woocommerce_sales_theme-two',
                    'woocommerce_sales_theme-three',
                    'woocommerce_sales_theme-four',
                    'woocommerce_sales_theme-five',
                    'woocommerce_sales_conv-theme-ten',
                    'woocommerce_sales_conv-theme-eleven',
                    'woocommerce_sales_conv-theme-twelve',
                    'woocommerce_sales_conv-theme-thirteen',
                    'woocommerce_sales_conv-theme-fifteen',
                ]
            ],
            'woo_template_sales_count' => [
                'first_param' => GlobalFields::get_instance()->common_name_fields(),
                'third_param' => [
                    'tag_product_title' => __('Product Title', 'notificationx'),
                ],
                'fourth_param' => [
                    // 'tag_time' => __('Definite Time', 'notificationx'),
                ],
                '_themes' => [
                    'woocommerce_sales_conv-theme-six',
                    'woocommerce_sales_conv-theme-seven',
                    'woocommerce_sales_conv-theme-eight',
                    'woocommerce_sales_conv-theme-nine',
                    'woocommerce_sales_conv-theme-fourteen',
                    'woocommerce_sales_conv-theme-sixteen',
                ]
            ],
        ];
        add_filter("nx_filtered_entry_{$this->id}", array($this, 'conversion_data'), 11, 2);
    }
    
    /**
     * Hooked to nx_before_metabox_load action.
     *
     * @return void
     */
    public function init_fields() {
        parent::init_fields();
        add_filter('nx_notification_template', [$this, 'review_templates'], 7);
        add_filter('nx_content_trim_length_dependency', [$this, 'content_trim_length_dependency']);
    }


    /**
     * @todo remove in the future.
     *
     * @param [type] $data
     * @param [type] $settings
     * @return void
     */
    public function nx_can_entry($return, $entry, $settings){
        if(!($this->_excludes_product($entry['data'], $settings) && $this->_show_purchaseof($entry['data'], $settings))){
            return false;
        }

        return $return;
    }

     /**
     * @todo remove in the future.
     *
     * @param [type] $data
     * @param [type] $settings
     * @return void
     */
    public function show_exclude_product( $data, $settings ){
        $new_data = [];

        if( ! empty( $data ) ) {
            foreach( $data as $key => $product ) {
                if( $this->_excludes_product($product, $settings) && $this->_show_purchaseof($product, $settings)  ) {
                    $new_data[ $key ] = $product;
                }
            }
        }

        return $new_data;

    }

    public function _excludes_product( $product, $settings ){
        if( empty( $settings['product_exclude_by'] ) || $settings['product_exclude_by'] === 'none' ) {
            return true;
        }

        $product_category_list = [];

        $product_id = $product['product_id'];
        if( $settings['product_exclude_by'] == 'product_category' ) {
            $term = 'product_cat';
            if($settings['source'] == 'edd' || $settings['source'] == 'edd_inline'){
                $term = 'download_category';
            }
            $product_categories = get_the_terms( $product_id, $term );
            if( ! is_wp_error( $product_categories ) ) {
                foreach( $product_categories as $category ) {
                    $product_category_list[] = $category->slug;
                }
            }

            $product_category_count = count( $product_category_list );
            $array_diff = array_diff( $product_category_list, $settings['exclude_categories'] );
            $array_diff_count = count( $array_diff );

            if( ! ( $array_diff_count < $product_category_count ) ) {
                return true;
            }
            $product_category_list = [];
        }
        if( $settings['product_exclude_by'] == 'manual_selection' ) {
            if( isset($settings['exclude_products']) && is_array($settings['exclude_products']) && ! in_array( $product_id, $settings['exclude_products'] ) ) {
                return true;
            }
        }

        return false;

    }


    public function _show_purchaseof( $product, $settings ){
        if( empty( $settings['product_control'] ) || $settings['product_control'] === 'none' ) {
            return true;
        }

        $product_category_list = [];

        $product_id = $product['product_id'];
        if( $settings['product_control'] == 'product_category' ) {
            $term = 'product_cat';
            if($settings['source'] == 'edd' || $settings['source'] == 'edd_inline'){
                $term = 'download_category';
            }
            $product_categories = get_the_terms( $product_id, $term );
            if(is_array($product_categories) && ! is_wp_error( $product_categories ) ) {
                foreach( $product_categories as $category ) {
                    $product_category_list[] = $category->slug;
                }
            }

            $product_category_count = count( $product_category_list );
            $array_diff = array_diff( $product_category_list, $settings['category_list'] );
            $array_diff_count = count( $array_diff );

            if( $array_diff_count < $product_category_count ) {
                return true;
            }

        }
        if( $settings['product_control'] == 'manual_selection' ) {
            if( in_array( $product_id, $settings['product_list'] ) ) {
                return true;
            }
        }

        return false;
    }
    

}
