<?php
/**
 * Frontend display for tier and package pricing
 */

if (!defined('ABSPATH')) {
    exit;
}

class WC_TPP_Frontend {

    public function __construct() {
        add_action('wp_enqueue_scripts', array($this, 'enqueue_scripts'));
        add_action('woocommerce_before_add_to_cart_button', array($this, 'display_pricing_table_before'), 20);
        add_action('woocommerce_after_add_to_cart_button', array($this, 'display_pricing_table_after'), 10);
        add_action('woocommerce_single_product_summary', array($this, 'display_pricing_table_after_price'), 15);
        add_action('woocommerce_before_add_to_cart_quantity', array($this, 'maybe_hide_quantity_input'));

        // Modify catalog add to cart button for restricted products
        add_filter('woocommerce_loop_add_to_cart_link', array($this, 'modify_catalog_add_to_cart_button'), 10, 2);
    }

    public function enqueue_scripts() {
        // Enqueue CSS on all WooCommerce pages (for catalog buttons and cart)
        if (is_woocommerce() || is_cart() || is_checkout() || is_product()) {
            wp_enqueue_style('wc-tpp-frontend', WC_TPP_PLUGIN_URL . 'assets/css/frontend.css', array(), WC_TPP_VERSION);
        }

        // Enqueue JS only on product pages
        if (is_product()) {
            wp_enqueue_script('wc-tpp-frontend', WC_TPP_PLUGIN_URL . 'assets/js/frontend.js', array('jquery'), WC_TPP_VERSION, true);

            // Localize script with currency settings
            wp_localize_script('wc-tpp-frontend', 'wcTppData', array(
                'currency_symbol' => esc_js(get_woocommerce_currency_symbol()),
                'currency_position' => esc_js(get_option('woocommerce_currency_pos', 'left')),
                'price_decimals' => absint(wc_get_price_decimals()),
                'price_decimal_separator' => esc_js(wc_get_price_decimal_separator()),
                'price_thousand_separator' => esc_js(wc_get_price_thousand_separator())
            ));
        }
    }

    public function display_pricing_table_before() {
        if (get_option('wc_tpp_display_position') === 'before_add_to_cart') {
            $this->display_pricing_table();
        }
    }

    public function display_pricing_table_after() {
        if (get_option('wc_tpp_display_position') === 'after_add_to_cart') {
            $this->display_pricing_table();
        }
    }

    public function display_pricing_table_after_price() {
        if (get_option('wc_tpp_display_position') === 'after_price') {
            $this->display_pricing_table();
        }
    }

    public function maybe_hide_quantity_input() {
        global $product;

        if (!$product || !is_a($product, 'WC_Product')) {
            return;
        }

        $product_id = $product->get_id();
        $global_restrict = get_option('wc_tpp_restrict_package_quantities', 'no') === 'yes';
        $product_restrict = get_post_meta($product_id, '_wc_tpp_restrict_to_packages', true) === 'yes';
        $packages = get_post_meta($product_id, '_wc_tpp_packages', true);

        // Hide quantity input if restriction is enabled and packages exist
        if (($global_restrict || $product_restrict) && !empty($packages)) {
            echo '<style>.quantity { display: none !important; }</style>';
        }
    }

    public function display_pricing_table() {
        global $product;

        if (!$product || !is_a($product, 'WC_Product') || get_option('wc_tpp_display_table') !== 'yes') {
            return;
        }

        $product_id = $product->get_id();
        $tiers = get_post_meta($product_id, '_wc_tpp_tiers', true);
        $packages = get_post_meta($product_id, '_wc_tpp_packages', true);
        $global_restrict = get_option('wc_tpp_restrict_package_quantities', 'no') === 'yes';
        $product_restrict = get_post_meta($product_id, '_wc_tpp_restrict_to_packages', true) === 'yes';

        if (empty($tiers) && empty($packages)) {
            return;
        }

        WC_TPP_Template_Loader::get_instance()->display('frontend/pricing-table.twig', array(
            'product' => $product,
            'tiers' => $tiers,
            'packages' => $packages,
            'restrict_to_packages' => $global_restrict || $product_restrict
        ));
    }

    public static function get_tier_price($product_id, $quantity) {
        $tiers = get_post_meta($product_id, '_wc_tpp_tiers', true);

        if (empty($tiers) || !is_array($tiers)) {
            return null;
        }

        $applicable_price = null;
        foreach ($tiers as $tier) {
            if ($quantity >= $tier['min_qty']) {
                $applicable_price = $tier['price'];
            }
        }

        return $applicable_price;
    }

    public static function get_package_price($product_id, $quantity) {
        $packages = get_post_meta($product_id, '_wc_tpp_packages', true);

        if (empty($packages) || !is_array($packages)) {
            return null;
        }

        foreach ($packages as $package) {
            if ($quantity == $package['qty']) {
                return $package['price'];
            }
        }

        return null;
    }

    /**
     * Check if a product has quantity restrictions enabled
     *
     * @param int $product_id Product ID
     * @return bool
     */
    public static function has_quantity_restriction($product_id) {
        $global_restrict = get_option('wc_tpp_restrict_package_quantities', 'no') === 'yes';
        $product_restrict = get_post_meta($product_id, '_wc_tpp_restrict_to_packages', true) === 'yes';
        $packages = get_post_meta($product_id, '_wc_tpp_packages', true);

        return ($global_restrict || $product_restrict) && !empty($packages);
    }

    /**
     * Modify catalog add to cart button for products with quantity restrictions
     *
     * @param string $html Add to cart button HTML
     * @param WC_Product $product Product object
     * @return string Modified HTML
     */
    public function modify_catalog_add_to_cart_button($html, $product) {
        if (!$product || !is_a($product, 'WC_Product')) {
            return $html;
        }

        $product_id = $product->get_id();

        // Check if product has quantity restrictions
        if (!self::has_quantity_restriction($product_id)) {
            return $html;
        }

        // Replace add to cart button with "View Options" link
        $product_url = esc_url($product->get_permalink());
        $button_text = esc_html__('View Options', 'wc-tier-package-prices');

        $new_html = sprintf(
            '<a href="%s" class="button wc-tpp-view-options product_type_simple" aria-label="%s">%s</a>',
            $product_url,
            esc_attr(sprintf(__('View options for %s', 'wc-tier-package-prices'), $product->get_name())),
            $button_text
        );

        return $new_html;
    }
}

new WC_TPP_Frontend();
