<?php
namespace WprAddons\Classes;

if ( ! defined( 'ABSPATH' ) ) {
	exit; // Exit if accessed directly.
}

/**
 * WPR_Count_Wishlist_Compare_Items setup
 *
 * @since 1.0
 */
class WPR_Count_Wishlist_Compare_Items { 

    /**
    ** Constructor
    */
    public function __construct() {
        add_action( 'wp_ajax_count_wishlist_items',[$this, 'count_wishlist_items'] );
        add_action( 'wp_ajax_nopriv_count_wishlist_items',[$this, 'count_wishlist_items'] );
        add_action( 'wp_ajax_count_compare_items',[$this, 'count_compare_items'] );
        add_action( 'wp_ajax_nopriv_count_compare_items',[$this, 'count_compare_items'] );
    }

	// Add two new functions for handling cookies
	public function get_wishlist_from_cookie() {
        if (isset($_COOKIE['wpr_wishlist'])) {
            $raw = json_decode(stripslashes($_COOKIE['wpr_wishlist']), true);
            return is_array($raw) ? array_filter(array_map('absint', $raw)) : array();
        } else if ( isset($_COOKIE['wpr_wishlist_'. get_current_blog_id() .'']) ) {
            $raw = json_decode(stripslashes($_COOKIE['wpr_wishlist_'. get_current_blog_id() .'']), true);
            return is_array($raw) ? array_filter(array_map('absint', $raw)) : array();
        }
        return array();
	}
    
    function get_compare_from_cookie() {
        if (isset($_COOKIE['wpr_compare'])) {
            $raw = json_decode(stripslashes($_COOKIE['wpr_compare']), true);
            return is_array($raw) ? array_filter(array_map('absint', $raw)) : array();
        } else if ( isset($_COOKIE['wpr_compare_'. get_current_blog_id() .'']) ) {
            $raw = json_decode(stripslashes($_COOKIE['wpr_compare_'. get_current_blog_id() .'']), true);
            return is_array($raw) ? array_filter(array_map('absint', $raw)) : array();
        }
        return array();
    }
    
    function count_wishlist_items() {
        if ( ! isset( $_POST['nonce'] ) || ! wp_verify_nonce( sanitize_text_field( wp_unslash( $_POST['nonce'] ) ), 'wpr-addons-js' ) ) {
            wp_send_json_error( array( 'message' => esc_html__( 'Security check failed.', 'wpr-addons' ) ) );
        }
        $user_id = get_current_user_id();
        
        if ($user_id > 0) {
            $wishlist = get_user_meta($user_id, 'wpr_wishlist', true);
            if (!$wishlist) {
                $wishlist = array();
            }
        } else {
            $wishlist = $this->get_wishlist_from_cookie();
        }

        $product_data = [];

       $product_data['wishlist_count'] = sizeof($wishlist);
       $wishlist_product_array = [];

        $settings = [
            'element_addcart_simple_txt' => isset($_POST['element_addcart_simple_txt']) ? wp_kses_post( wp_unslash( $_POST['element_addcart_simple_txt'] ) ) : '', 
            'element_addcart_grouped_txt' => isset($_POST['element_addcart_grouped_txt']) ? wp_kses_post( wp_unslash( $_POST['element_addcart_grouped_txt'] ) ) : '', 
            'element_addcart_variable_txt' => isset($_POST['element_addcart_variable_txt']) ? wp_kses_post( wp_unslash( $_POST['element_addcart_variable_txt'] ) ) : ( isset($_POST['element_addcart_grouped_txt']) ? wp_kses_post( wp_unslash( $_POST['element_addcart_grouped_txt'] ) ) : '' )
        ];
            
        foreach ($wishlist as $product_id) {
            $product = wc_get_product($product_id);

            if ($product) {
                $wishlist_product_array[] = [
                    'product_id' => $product_id,
                    'product_image' => $product->get_image(),
                    'product_title' => $product->get_title(),
                    'product_url' => $product->get_permalink(),
                    'product_price' => $product->get_price_html(),
                    'product_stock' => $product->get_stock_status() == 'instock' ? esc_html__('In Stock', 'wpr-addons') : esc_html__('Out of Stock', 'wpr-addons'),
                    'product_atc' => $this->render_product_add_to_cart($settings, $product)
                ];
            }
        }

        $product_data['wishlist_items'] = $wishlist_product_array;

       wp_send_json($product_data);

       wp_die();
    }
    
    public function count_compare_items() {
        if ( ! isset( $_POST['nonce'] ) || ! wp_verify_nonce( sanitize_text_field( wp_unslash( $_POST['nonce'] ) ), 'wpr-addons-js' ) ) {
            wp_send_json_error( array( 'message' => esc_html__( 'Security check failed.', 'wpr-addons' ) ) );
        }
        $user_id = get_current_user_id();
        
        if ($user_id > 0) {
            $compare = get_user_meta($user_id, 'wpr_compare', true);
            if (!$compare) {
                $compare = array();
            }
        } else {
            $compare = $this->get_compare_from_cookie();
        }

        $product_data = [];

       $product_data['compare_count'] = sizeof($compare);
       $product_data['compare_table'] = $this->compare_table();

       wp_send_json($product_data);

       wp_die();
    }

    // Function to get the attribute taxonomy from the label
    public function get_taxonomy_from_label( $label ) {
        global $wpdb;
        $taxonomy = $wpdb->get_var( $wpdb->prepare("
            SELECT attribute_name
            FROM {$wpdb->prefix}woocommerce_attribute_taxonomies
            WHERE attribute_label = %s
            LIMIT 1
        ", $label) );

        return $taxonomy ? 'pa_' . $taxonomy : '';
    }

    public function compare_table() {
        $user_id = get_current_user_id();
		$notification_hidden = '';
		$table_hidden = '';

        $settings = [
            'compare_empty_text' => isset($_POST['compare_empty_text']) ? wp_kses_post( wp_unslash( $_POST['compare_empty_text'] ) ) : '',
            'remove_from_compare_text' => isset($_POST['remove_text']) ? sanitize_text_field( wp_unslash( $_POST['remove_text'] ) ) : '',
            'element_addcart_simple_txt' => isset($_POST['element_addcart_simple_txt']) ? wp_kses_post( wp_unslash( $_POST['element_addcart_simple_txt'] ) ) : '', 
            'element_addcart_grouped_txt' => isset($_POST['element_addcart_grouped_txt']) ? wp_kses_post( wp_unslash( $_POST['element_addcart_grouped_txt'] ) ) : '', 
            'element_addcart_variable_txt' => isset($_POST['element_addcart_variable_txt']) ? wp_kses_post( wp_unslash( $_POST['element_addcart_variable_txt'] ) ) : ( isset($_POST['element_addcart_grouped_txt']) ? wp_kses_post( wp_unslash( $_POST['element_addcart_grouped_txt'] ) ) : '' )
        ];

		if ($user_id > 0) {
			$compare = get_user_meta( get_current_user_id(), 'wpr_compare', true );
		
			if ( ! $compare ) {
				$compare = array();
			}
		} else {
			$compare = $this->get_compare_from_cookie();
		}
		
        if ( ! $compare ) {
			$table_hidden = 'wpr-hidden-element';
        } else {
			$notification_hidden = 'wpr-hidden-element';
		}

        ob_start();

		echo '<p class="wpr-compare-empty '. esc_attr( $notification_hidden ) .'">'. $settings['compare_empty_text'] .'</p>';
        
        // Start the table
		echo '<div class="wpr-compare-products '. $table_hidden .'">';
        echo '<table class="wpr-compare-table">';
        
            // Create the first row of table headers
            echo '<tr>';
            echo '<th></th>'; // Blank space for top-left corner
            foreach ( $compare as $product_id ) {
                $product = wc_get_product( $product_id );
                if ( ! $product ) {
                    continue;
                }
                
                $remove_text = $settings['remove_from_compare_text'];
                
                // Translators: %s will be replaced by the text for removing from compare
                $remove_text_tr = sprintf( __( '%s', 'wpr-addons' ), $remove_text );
                
                echo '<th data-product-id="' . esc_attr( $product->get_id() ) . '">
                        <button class="wpr-compare-remove" data-product-id="' . esc_attr( $product->get_id() ) . '">' . esc_html( $remove_text_tr ) . '</button>
                      </th>';
                
            }
            echo '</tr>';
            
            // Create the remaining rows of the table
            $table_data = array(
                ['label' => esc_html__('Image', 'wpr-addons'), 'type' => 'image'],
                ['label' => esc_html__('Name', 'wpr-addons'), 'type' => 'text'],
                ['label' => esc_html__('Rating', 'wpr-addons'), 'type' => 'text'],
                ['label' => esc_html__('Description', 'wpr-addons'), 'type' => 'text'],
                ['label' => esc_html__('Price', 'wpr-addons'), 'type' => 'text'],
                ['label' => esc_html__('SKU', 'wpr-addons'), 'type' => 'text'],
                ['label' => esc_html__('Stock Status', 'wpr-addons'), 'type' => 'text'],
                ['label' => esc_html__('Dimensions', 'wpr-addons'), 'type' => 'text'],
                ['label' => esc_html__('Weight', 'wpr-addons'), 'type' => 'text']
            );

            
            $all_attributes = array();
            
            foreach ( $compare as $product_id ) {
                $product = wc_get_product( $product_id );
                
                if ( ! $product ) {
                    continue;
                }

                $attributes = $product->get_attributes();

                foreach ( $attributes as $attribute ) {
                    $attribute_name = wc_attribute_label($attribute->get_name());
                    if ( !in_array($attribute_name, $all_attributes) ) {
                        $all_attributes[] = $attribute_name;
                    }
                }
            }

            foreach ( $all_attributes as $attribute_name ) {
                $table_data[] = array('label' => $attribute_name, 'type' => 'text');
            }

            foreach ( $table_data as $row ) {
                echo '<tr>';
                echo '<th>' . $row['label'] . '</th>';
                foreach ( $compare as $key => $product_id ) {
                    $product = wc_get_product( $product_id );
                    if ( ! $product ) {
                        continue;
                    }
                    echo '<td data-product-id="' . $product->get_id() . '">';
                    switch ( $row['type'] ) {
                        case 'image':
                            echo '<a class="wpr-compare-img-wrap" href="' . $product->get_permalink() . '">' . $product->get_image() . '</a>';
							echo '<div class="wpr-compare-product-atc">' . $this->render_product_add_to_cart( $settings, $product ) . '</div>';
                            break;
                        case 'text': 
                            if( in_array(strtolower($row['label']), [strtolower(__('Description', 'wpr-addons')), strtolower(__('SKU', 'wpr-addons')) ]) ) {
                                echo $product->get_data()[strtolower($row['label'])];
                            } else if ( strtolower($row['label']) == strtolower(__('Name', 'wpr-addons')) ) {
                                echo '<a class="wpr-compare-product-name" href="' . $product->get_permalink() . '">'. $product->get_data()['name'] .'</a>';
							} else if ( strtolower($row['label']) == strtolower(__('Price', 'wpr-addons')) ) {
                                echo $product->get_price_html();
                            } else if ( strtolower($row['label']) ==strtolower(__('Rating', 'wpr-addons')) ) {
                                echo $this->render_product_rating($product);
                            } else if ( strtolower($row['label']) == strtolower(__('Stock Status', 'wpr-addons')) ) {
					            $stock_status = $product->get_stock_status();
                                echo $stock_status == 'instock' ? esc_html__('In Stock', 'wpr-addons') : esc_html__('Out of Stock', 'wpr-addons');
                            } else if ( strtolower($row['label']) == strtolower(__('Dimensions', 'wpr-addons')) ) {

								if ( $product->has_dimensions() ) {
									$dimensions = sprintf(
										'<span class="wpr-dimensions">%s</span>',
										wc_format_dimensions( $product->get_dimensions( false ) )
									);
	
									echo $dimensions;
								}
								
							} else if ( strtolower($row['label']) == strtolower(__('Weight', 'wpr-addons')) ) {

								if ( $product->get_weight() ) {
									$weight = sprintf(
										'<span class="wpr-weight">%s %s</span>',
										$product->get_weight(),
										get_option( 'woocommerce_weight_unit' )
									);
	
									echo $weight;
								}

							} else {      
                                $attributes = $product->get_attributes();
                                $attribute_name = wc_attribute_label(strtolower($row['label']));

								foreach ($product->get_attributes($product_id) as $attr) {

									if ( strtolower($attr['name']) === strtolower($row['label']) ) {
										echo $attr['value'];
									}
								}

								// Product Attributes
                                // $attribute_name = $this->format_variable($attribute_name);
                                $attribute_name = $this->get_taxonomy_from_label($attribute_name);

								if (isset($attributes[$attribute_name])) {
									// Get the value(s) of the 'dimensions' attribute for the product
									$attributes_value = $attributes[$attribute_name]->get_options();
									$attributes_value_array = [];

									// Loop through the values and output them
									foreach ($attributes_value as $value) {
										$term = get_term($value);
										$attributes_value_array[] = $term->name;
									}

									echo implode(' | ', $attributes_value_array);
								}
                            }
                            break;
                    }
                    echo '</td>';
                }
                echo '</tr>';
            }
        
        // Close the table
        echo '</table>';
		echo '</div>';

        return ob_get_clean();
    }

    public function format_variable($variable) {
        $variable = strtolower($variable); // Convert to lowercase
        $variable = str_replace(' ', '-', $variable); // Replace spaces with hyphens
        return $variable;
    }

    public function render_product_rating($product) {

        // $rating_count = $product->get_rating_count();
		// $rating_amount = floatval( $product->get_average_rating() );
		// $round_rating = (int)$rating_amount;
        // $rating_icon = '&#9734;';

		// echo '<div class="wpr-woo-rating">';

		// 	for ( $i = 1; $i <= 5; $i++ ) {
		// 		if ( $i <= $rating_amount ) {
		// 			echo '<i class="wpr-rating-icon-full">'. $rating_icon .'</i>';
		// 		} elseif ( $i === $round_rating + 1 && $rating_amount !== $round_rating ) {
		// 			echo '<i class="wpr-rating-icon-'. ( $rating_amount - $round_rating ) * 10 .'">'. $rating_icon .'</i>';
		// 		} else {
		// 			echo '<i class="wpr-rating-icon-empty">'. $rating_icon .'</i>';
		// 		}
	    //  	}

		// echo '</div>';

		// Another option
		$rating  = $product->get_average_rating();
		$count   = $product->get_rating_count();
		return wc_get_rating_html( $rating, $count );
	}
    	
	// Render Add To Cart
	public function render_product_add_to_cart( $settings, $product ) {

		// If NOT a Product
		if ( is_null( $product ) ) {
			return;
		}

		ob_start();

		// Get Button Class
		$button_class = implode( ' ', array_filter( [
			'product_type_'. $product->get_type(),
			$product->is_purchasable() && $product->is_in_stock() ? 'add_to_cart_button' : '',
			$product->supports( 'ajax_add_to_cart' ) ? 'ajax_add_to_cart' : '',
		] ) );

		$attributes = [
			'rel="nofollow"',
			'class="'. esc_attr($button_class) .' wpr-button-effect '. (!$product->is_in_stock() && 'simple' === $product->get_type() ? 'wpr-atc-not-clickable' : '').'"',
			'aria-label="'. esc_attr($product->add_to_cart_description()) .'"',
			'data-product_id="'. esc_attr($product->get_id()) .'"',
			'data-product_sku="'. esc_attr($product->get_sku()) .'"',
		];

		$button_HTML = '';
		$page_id = get_queried_object_id();

		// Button Text
		if ( 'simple' === $product->get_type() ) {
			$button_HTML .= $settings['element_addcart_simple_txt'];

			if ( 'yes' === get_option('woocommerce_enable_ajax_add_to_cart') ) {
				array_push( $attributes, 'href="'. esc_url( get_permalink( $page_id ) .'/?add-to-cart='. get_the_ID() ) .'"' );
			} else {
				array_push( $attributes, 'href="'. esc_url( get_permalink() ) .'"' );
			}
		} elseif ( 'grouped' === $product->get_type() ) {
			$button_HTML .= $settings['element_addcart_grouped_txt'];
			array_push( $attributes, 'href="'. esc_url( $product->get_permalink() ) .'"' );
		} elseif ( 'variable' === $product->get_type() ) {
			$button_HTML .= $settings['element_addcart_variable_txt'];
			array_push( $attributes, 'href="'. esc_url( $product->get_permalink() ) .'"' );
		} else {
			array_push( $attributes, 'href="'. esc_url( $product->get_product_url() ) .'"' );
			$button_HTML .= get_post_meta( get_the_ID(), '_button_text', true ) ? get_post_meta( get_the_ID(), '_button_text', true ) : 'Buy Product';
		}

			// Button HTML
		echo '<a '. implode( ' ', $attributes ) .'><span>'. $button_HTML .'</span></a>'; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped

		return \ob_get_clean();
	} 
}

new WPR_Count_Wishlist_Compare_Items();