<?php
if ( ! defined( 'ABSPATH' ) ) { exit; }

class KNSDD_Frontend {
    // Modüler bileşen örnekleri (davranışı değiştirmez; sadece hazır eder)
    private $message_service;
    private $campaign_validator;
    private $wc_notice_presenter;
    private $checkout_notices_controller;
    private $cart_presenter;
    private $message_renderer;
    private $icon_renderer;
    private $frontend_assets;
    private $shortcode_product_promo;
    // Tercihler (gerekirse ileride kullanılabilir)
    // private $prefer_totals_checkout = true; // Checkout'ta birincil gösterim: toplamlar satırı

    public function __construct() {
        // Ürün mesajı için dinamik kanca kaydı (ayarlar üzerinden)
        add_action( 'init', array( $this, 'register_product_message_hooks' ), 20 );

        // Mevcut kancalar
        add_action( 'woocommerce_widget_shopping_cart_before_buttons', array( $this, 'display_messages_in_mini_cart' ), 10 );
        // Mini sepet fee satırı (indirim) gösterimi istek üzerine kaldırıldı.

        // Ürün listeleme (loop) sayfalarında promosyon mesajı gösterme devre dışı

        // YENİ: Hibrit Sistem - WooCommerce native + fallback
        // 1) Sepet sayfası: Gönderim ve Toplam satırları arasında temiz tablo satırı
        add_action( 'woocommerce_cart_totals_before_order_total', array( $this, 'add_cart_notices_table_fallback' ), 10 );
        
        // 2) Ödeme sayfası: çoklu kanca stratejisi (hepsi aktif, guard ile tek gösterim)
        // Primary: TOPLUMLAR SATIRI (ilk çalışsın diye en düşük öncelik değeri)
        add_action( 'woocommerce_review_order_before_order_total', array( $this, 'add_checkout_notices_table_fallback' ), 1 );
        // Fallback 2: inline (ikincil)
        add_action( 'woocommerce_checkout_billing', array( $this, 'add_checkout_notices_fallback2' ), 20 );
        // Fallback 1: custom panel (üçüncül)
        add_action( 'woocommerce_checkout_before_customer_details', array( $this, 'add_checkout_notices_fallback1' ), 30 );
        // En son: native notice (tema destekliyorsa)
        add_action( 'woocommerce_before_checkout_form', array( $this, 'add_checkout_notices' ), 40 );
        
        // Frontend CSS (sadece stil için gerekli)
        add_action( 'wp_enqueue_scripts', array( $this, 'enqueue_frontend_assets' ) );

        // Ürün satırı altında kademeli mesajlar (global ayarlara göre)
        // Sepet & Ödeme: ürün adı filtresi
        add_filter( 'woocommerce_cart_item_name', array( $this, 'filter_cart_item_name_append_line_msg' ), 99, 3 );
        // Mini sepet: ürün adı filtresi
        add_filter( 'woocommerce_mini_cart_item_name', array( $this, 'filter_mini_cart_item_name_append_line_msg' ), 99, 3 );

        // Üstü çizili fiyat gösterimi (sepet/checkout/mini sepet) - ayarla kontrol edilir
        add_filter( 'woocommerce_cart_item_price', array( $this, 'strikethrough_cart_item_price' ), 999, 3 );
        add_filter( 'woocommerce_cart_item_subtotal', array( $this, 'strikethrough_cart_item_subtotal' ), 999, 3 );
        add_filter( 'woocommerce_widget_cart_item_quantity', array( $this, 'strikethrough_mini_cart_item_quantity' ), 999, 3 );

        // Shortcode: Builder bağımsız yerleşim
        add_shortcode( 'knsdd_product_promo', array( $this, 'shortcode_product_promo' ) );
        // Shortcode: Kademe Tablosu (Elementor vb. içine kesin yerleşim)
        add_shortcode( 'knsdd_tier_table', array( $this, 'shortcode_tier_table' ) );

        // Modüler bileşenleri hazırla (şimdilik sadece yapılandırma; mevcut davranış korunur)
        if ( class_exists( 'KNSDD_Campaign_Validator' ) ) {
            $this->campaign_validator = new KNSDD_Campaign_Validator();
        }
        if ( class_exists( 'KNSDD_Message_Service' ) ) {
            // Campaign validator'ı servise enjekte et
            $this->message_service = new KNSDD_Message_Service( $this->campaign_validator );
        }
        
        if ( class_exists( 'KNSDD_Checkout_Notices_Controller' ) ) {
            $this->checkout_notices_controller = new KNSDD_Checkout_Notices_Controller();
        }
        
        if ( class_exists( 'KNSDD_WC_Notice_Presenter' ) ) {
            $this->wc_notice_presenter = new KNSDD_WC_Notice_Presenter();
        }
        
        if ( class_exists( 'KNSDD_Cart_Presenter' ) ) {
            $this->cart_presenter = new KNSDD_Cart_Presenter();
        }
        if ( class_exists( 'KNSDD_Icon_Renderer' ) ) {
            $this->icon_renderer = new KNSDD_Icon_Renderer();
        }
        if ( class_exists( 'KNSDD_Message_Renderer' ) ) {
            // Icon renderer'ı enjekte ederek oluştur
            $this->message_renderer = new KNSDD_Message_Renderer( $this->icon_renderer );
        }
        if ( class_exists( 'KNSDD_Frontend_Assets' ) ) {
            $this->frontend_assets = new KNSDD_Frontend_Assets();
        }
        if ( class_exists( 'KNSDD_Shortcode_Product_Promo' ) ) {
            $this->shortcode_product_promo = new KNSDD_Shortcode_Product_Promo();
        }

        // Kademe tablosu (fiyat üstü) için dinamik kanca kaydı
        add_action( 'init', array( $this, 'register_tier_table_hooks' ), 20 );
    }

    /**
     * FALLBACK 1: Checkout customer details öncesi uyarıları göster.
     */
    public function add_checkout_notices_fallback1() {
        if ( class_exists('KNSDD_Data') && method_exists('KNSDD_Data','is_globally_enabled') ) {
            if ( ! KNSDD_Data::is_globally_enabled() ) { return; }
        }
        $messages = $this->get_block_area_messages( 'show_checkout' );
        if ( empty( $messages ) ) { return; }
        if ( $this->checkout_notices_controller ) {
            $this->checkout_notices_controller->show_fallback1( $messages, $this->wc_notice_presenter, $this->message_renderer );
            return;
        }
        // Controller yoksa doğrudan presenter/renderer kullan
        if ( $this->wc_notice_presenter && $this->message_renderer ) {
            $this->wc_notice_presenter->present_checkout_notices_fallback1( $messages, $this->message_renderer );
        } else if ( $this->message_renderer ) {
            $this->message_renderer->render_custom_checkout_notices( $messages );
        }
    }

    /**
     * Force modu açıkken, Woo kancaları çalışmazsa son çare olarak footer'da konteyner bas.
     * Bu, JS relocator'ın konteyneri hedefe taşıyabilmesi için gereklidir.
     */
    public function ensure_tier_container_in_footer() {
        // Sadece ürün sayfasında, global açıkken ve henüz basılmamışsa
        if ( ! function_exists('is_product') || ! is_product() ) { return; }
        if ( class_exists('KNSDD_Data') && method_exists('KNSDD_Data','is_globally_enabled') ) {
            if ( ! KNSDD_Data::is_globally_enabled() ) { return; }
        }
        if ( $this->tier_table_shown ) { return; }

        // Ayar: tablo devre dışı ise çık
        $options = get_option( 'knsdd_global_settings', array() );
        $enabled = isset( $options['tier_table_enabled'] ) ? (int) !! $options['tier_table_enabled'] : 1;
        if ( ! $enabled ) { return; }

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

        $container_id = 'knsdd-tier-' . $product->get_id() . '-' . wp_generate_uuid4();
        echo '<div class="knsdd-tier-table-container" id="' . esc_attr( $container_id ) . '" data-parent-id="' . esc_attr( $product->get_id() ) . '" data-product-id="' . esc_attr( $product->get_id() ) . '"></div>';
        $this->tier_table_shown = true;
    }

    /**
     * FALLBACK 2: Checkout billing alanı öncesi inline uyarıları göster.
     */
    public function add_checkout_notices_fallback2() {
        if ( class_exists('KNSDD_Data') && method_exists('KNSDD_Data','is_globally_enabled') ) {
            if ( ! KNSDD_Data::is_globally_enabled() ) { return; }
        }
        $messages = $this->get_block_area_messages( 'show_checkout' );
        if ( empty( $messages ) ) { return; }
        if ( $this->checkout_notices_controller ) {
            $this->checkout_notices_controller->show_fallback2( $messages, $this->wc_notice_presenter, $this->message_renderer );
            return;
        }
        if ( $this->wc_notice_presenter && $this->message_renderer ) {
            $this->wc_notice_presenter->present_checkout_notices_fallback2( $messages, $this->message_renderer );
        } else if ( $this->message_renderer ) {
            $this->message_renderer->render_inline_checkout_notices( $messages );
        }
    }

    /**
     * FALLBACK 3: Checkout toplamlar bölümünde temiz tablo satırı ile uyarıları göster.
     */
    public function add_checkout_notices_table_fallback() {
        if ( class_exists('KNSDD_Data') && method_exists('KNSDD_Data','is_globally_enabled') ) {
            if ( ! KNSDD_Data::is_globally_enabled() ) { return; }
        }
        $messages = $this->get_block_area_messages( 'show_checkout' );
        if ( empty( $messages ) ) { return; }
        if ( $this->checkout_notices_controller ) {
            $this->checkout_notices_controller->show_table_fallback( $messages, $this->wc_notice_presenter, $this->message_renderer );
            return;
        }
        if ( $this->wc_notice_presenter && $this->message_renderer ) {
            $this->wc_notice_presenter->present_checkout_notices_table_fallback( $messages, $this->message_renderer );
        } else if ( $this->message_renderer ) {
            $this->message_renderer->render_clean_table_notices( $messages );
        }
    }

    /**
     * Sepet toplamları kısmında temiz tablo satırı ile uyarıları göster.
     */
    public function add_cart_notices_table_fallback() {
        if ( class_exists('KNSDD_Data') && method_exists('KNSDD_Data','is_globally_enabled') ) {
            if ( ! KNSDD_Data::is_globally_enabled() ) { return; }
        }
        $messages = $this->get_block_area_messages( 'show_cart' );
        if ( empty( $messages ) ) { return; }
        if ( $this->cart_presenter && $this->message_renderer ) {
            $this->cart_presenter->present_cart_notices_table_row( $messages, $this->message_renderer );
        } else if ( $this->message_renderer ) {
            $this->message_renderer->render_clean_table_notices( $messages );
        }
    }

    /**
     * Sadece ürün sayfasında gösterilecek tanıtım mesajını alır ve render eder.
     */
    public function display_message_on_product_page() {
        if ( class_exists('KNSDD_Data') && method_exists('KNSDD_Data','is_globally_enabled') ) {
            if ( ! KNSDD_Data::is_globally_enabled() ) { return; }
        }
        global $product;
        if ( ! is_a( $product, 'WC_Product' ) ) {
            return;
        }

        // Aynı sayfada birden fazla kancadan tetiklenebilir; tekrar göstermeyi önle
        if ( $this->product_promo_shown ) {
            return;
        }
        // AJAX cache-bypass: server-side render yerine konteyner bas.
        $container_id = 'knsdd-promo-' . $product->get_id() . '-' . wp_generate_uuid4();
        echo '<div class="knsdd-product-promo" id="' . esc_attr( $container_id ) . '" data-product-id="' . esc_attr( $product->get_id() ) . '"></div>';
        $this->product_promo_shown = true;
    }

    /**
     * Ürün mesajı için primary ve fallback kancaları kaydeder (ayarlar üzerinden).
     * Primary/fallback sırası Kademe Tablosu ile tutarlı tutulur.
     */
    public function register_product_message_hooks() {
        $options = get_option( 'knsdd_global_settings', array() );
        if ( class_exists('KNSDD_Data') && method_exists('KNSDD_Data','is_globally_enabled') ) {
            if ( ! KNSDD_Data::is_globally_enabled() ) { return; }
        }

        $location = isset( $options['product_message_location'] ) ? sanitize_text_field( $options['product_message_location'] ) : 'auto';

        switch ( $location ) {
            case 'summary':
                // Ürün özeti içinde; öncelik filtre ile ayarlanabilir (varsayılan 25)
                $prio_summary = apply_filters( 'knsdd_message_summary_priority', 25 );
                add_action( 'woocommerce_single_product_summary', array( $this, 'display_message_on_product_page' ), (int) $prio_summary );
                break;
            case 'button_before':
                $prio_btn_before = apply_filters( 'knsdd_message_button_before_priority', 5 );
                add_action( 'woocommerce_before_add_to_cart_form', array( $this, 'display_message_on_product_page' ), (int) $prio_btn_before );
                break;
            case 'button_after':
                $prio_btn_after = apply_filters( 'knsdd_message_button_after_priority', 1 );
                add_action( 'woocommerce_after_add_to_cart_form', array( $this, 'display_message_on_product_page' ), (int) $prio_btn_after );
                break;
            case 'price_above':
                $prio_summary = $this->guess_price_priority();
                $prio_summary = apply_filters( 'knsdd_message_summary_priority', (int) $prio_summary );
                add_action( 'woocommerce_single_product_summary', array( $this, 'display_message_on_product_page' ), (int) $prio_summary );
                break;
            case 'auto':
            default:
                // Primary: Sepete ekle ÜSTÜ (tema-agnostik, builder uyumlu)
                $prio_btn_before = apply_filters( 'knsdd_message_button_before_priority', 5 );
                add_action( 'woocommerce_before_add_to_cart_form', array( $this, 'display_message_on_product_page' ), (int) $prio_btn_before );
                // Fallback A: Fiyat ÜSTÜ (summary içinde fiyat kancasının 1 öncesi)
                $prio_summary = $this->guess_price_priority();
                $prio_summary = apply_filters( 'knsdd_message_summary_priority', (int) $prio_summary );
                add_action( 'woocommerce_single_product_summary', array( $this, 'display_message_on_product_page' ), (int) $prio_summary );
                // Fallback B: Sepete ekle ALTı
                $prio_btn_after = apply_filters( 'knsdd_message_button_after_priority', 1 );
                add_action( 'woocommerce_after_add_to_cart_form', array( $this, 'display_message_on_product_page' ), (int) $prio_btn_after );
                break;
        }
    }
    /**
     * Kademe tablosu için primary ve fallback kancaları kaydeder.
     * Primary: woocommerce_single_product_summary @ (price_priority - 1)
     * Fallback A: woocommerce_before_add_to_cart_form
     * Fallback B: woocommerce_after_single_product_summary
     */
    public function register_tier_table_hooks() {
        $options = get_option( 'knsdd_global_settings', array() );
        $enabled = isset( $options['tier_table_enabled'] ) ? (int) !! $options['tier_table_enabled'] : 1;
        if ( ! $enabled ) { return; }

        // Zorla açıkken, herhangi bir Woo kancası çalışmasa bile konteyneri garanti etmek için footer fallback ekle
        $force = ! empty( $options['tier_table_force'] );
        if ( $force ) {
            // Çok erken ekleyelim ki diğer eklentiler engel olmasın
            add_action( 'wp_footer', array( $this, 'ensure_tier_container_in_footer' ), 1 );
        }

        $location = isset( $options['tier_table_location'] ) ? sanitize_text_field( $options['tier_table_location'] ) : 'auto';
        switch ( $location ) {
            case 'summary':
                // Ürün özeti içinde; öncelik filtre ile ayarlanabilir (varsayılan 9)
                $prio_summary = apply_filters( 'knsdd_tier_table_summary_priority', 9 );
                add_action( 'woocommerce_single_product_summary', array( $this, 'display_tier_table_on_product_page' ), (int) $prio_summary );
                break;
            case 'button_before':
                $prio_btn_before = apply_filters( 'knsdd_tier_table_button_before_priority', 1 );
                add_action( 'woocommerce_before_add_to_cart_form', array( $this, 'display_tier_table_on_product_page' ), (int) $prio_btn_before );
                break;
            case 'button_after':
                $prio_btn_after = apply_filters( 'knsdd_tier_table_button_after_priority', 1 );
                add_action( 'woocommerce_after_add_to_cart_form', array( $this, 'display_tier_table_on_product_page' ), (int) $prio_btn_after );
                break;
            case 'price_above':
                // Fiyat kancasının hemen üstü (summary içinde)
                $prio_summary = $this->guess_price_priority();
                $prio_summary = apply_filters( 'knsdd_tier_table_summary_priority', (int) $prio_summary );
                add_action( 'woocommerce_single_product_summary', array( $this, 'display_tier_table_on_product_page' ), (int) $prio_summary );
                break;
            case 'auto':
            default:
                // Primary: Sepete ekle ÜSTÜ (tema-agnostik, builder uyumlu)
                $prio_btn_before = apply_filters( 'knsdd_tier_table_button_before_priority', 1 );
                add_action( 'woocommerce_before_add_to_cart_form', array( $this, 'display_tier_table_on_product_page' ), (int) $prio_btn_before );
                // Fallback A: Fiyat ÜSTÜ (summary içinde fiyat kancasının 1 öncesi)
                $prio_summary = $this->guess_price_priority();
                $prio_summary = apply_filters( 'knsdd_tier_table_summary_priority', (int) $prio_summary );
                add_action( 'woocommerce_single_product_summary', array( $this, 'display_tier_table_on_product_page' ), (int) $prio_summary );
                // Fallback B: Sepete ekle ALTı
                $prio_btn_after = apply_filters( 'knsdd_tier_table_button_after_priority', 1 );
                add_action( 'woocommerce_after_add_to_cart_form', array( $this, 'display_tier_table_on_product_page' ), (int) $prio_btn_after );
                break;
        }
    }

    /**
     * Fiyat kancasının önceliğini bulup 1 eksigini döndürür. Bulunamazsa 9.
     */
    private function guess_price_priority() {
        $default = 9;
        global $wp_filter;
        if ( isset( $wp_filter['woocommerce_single_product_summary'] ) ) {
            $callbacks = $wp_filter['woocommerce_single_product_summary'];
            // WP 5.0+ için WP_Hook nesnesi
            if ( is_object( $callbacks ) && isset( $callbacks->callbacks ) && is_array( $callbacks->callbacks ) ) {
                foreach ( $callbacks->callbacks as $priority => $group ) {
                    foreach ( $group as $cb ) {
                        if ( isset( $cb['function'] ) ) {
                            $fn = $cb['function'];
                            // Düz string fonksiyon
                            if ( is_string( $fn ) && $fn === 'woocommerce_template_single_price' ) {
                                return max( 1, (int)$priority - 1 );
                            }
                            // Closure veya array(callable)
                            if ( is_array( $fn ) && isset( $fn[1] ) && is_string( $fn[1] ) ) {
                                if ( $fn[1] === 'price' || $fn[1] === 'get_price_html' ) {
                                    return max( 1, (int)$priority - 1 );
                                }
                            }
                        }
                    }
                }
            }
        }
        return $default;
    }

    /**
     * Ürün sayfasında kademe tablosu için konteyner basar (AJAX ile içerik doldurulur).
     * Tek sefer basım guard içerir.
     */
    public function display_tier_table_on_product_page() {
        if ( class_exists('KNSDD_Data') && method_exists('KNSDD_Data','is_globally_enabled') ) {
            if ( ! KNSDD_Data::is_globally_enabled() ) { return; }
        }
        global $product;
        if ( ! is_a( $product, 'WC_Product' ) ) { return; }

        if ( $this->tier_table_shown ) { return; }

        $container_id = 'knsdd-tier-' . $product->get_id() . '-' . wp_generate_uuid4();
        echo '<div class="knsdd-tier-table-container" id="' . esc_attr( $container_id ) . '" data-parent-id="' . esc_attr( $product->get_id() ) . '" data-product-id="' . esc_attr( $product->get_id() ) . '"></div>';
        $this->tier_table_shown = true;
    }

    

    /**
     * Shortcode: [knsdd_product_promo]
     * İsteğe bağlı product_id parametresi alır. Yoksa global $product kullanılır.
     */
    public function shortcode_product_promo( $atts = array() ) {
        if ( class_exists('KNSDD_Data') && method_exists('KNSDD_Data','is_globally_enabled') ) {
            if ( ! KNSDD_Data::is_globally_enabled() ) { return ''; }
        }
        // Delegasyon: Shortcode sınıfı mevcutsa onu kullan
        if ( $this->shortcode_product_promo && $this->message_renderer ) {
            return $this->shortcode_product_promo->render( $atts, $this->message_renderer );
        }

        // Fallback: Orijinal gövde
        $atts = shortcode_atts( array(
            'product_id' => 0,
        ), $atts, 'knsdd_product_promo' );

        $product_id = intval( $atts['product_id'] );
        if ( $product_id <= 0 ) {
            global $product;
            if ( ! is_a( $product, 'WC_Product' ) ) {
                return '';
            }
            $product_id = $product->get_id();
        }

        $rule = KNSDD_Discount_Engine::get_first_rule_for_product( $product_id );
        
        if ( ! $rule ) {
            return '';
        }

        // BOGO kampanyası için özel mesaj seçimi
        if ( isset($rule['campaign_type']) && $rule['campaign_type'] === 'buy_x_get_y_discount' ) {
            $msg_data = $this->resolve_bogo_message_for_product( $product_id, $rule );
        } else {
            // Standart kampanyalar
            $msg_data = isset($rule['messages']['product']) ? $rule['messages']['product'] : null;
        }
        
        if ( ! $msg_data || empty( $msg_data['show'] ) || empty( $msg_data['text'] ) ) {
            return '';
        }
        

        $message = array(
            'text'      => $msg_data['text'],
            'color'     => isset( $msg_data['color'] ) ? $msg_data['color'] : '',
            'highlight' => ! empty( $msg_data['highlight'] ),
            'icon'      => array(
                'enabled'  => ! empty( $msg_data['icon']['enabled'] ),
                'pack'     => isset( $msg_data['icon']['pack'] ) ? $msg_data['icon']['pack'] : '',
                'value'    => isset( $msg_data['icon']['value'] ) ? $msg_data['icon']['value'] : '',
                'color'    => isset( $msg_data['icon']['color'] ) ? $msg_data['icon']['color'] : '',
                'position' => isset( $msg_data['icon']['position'] ) ? $msg_data['icon']['position'] : 'before',
                'size'     => isset( $msg_data['icon']['size'] ) ? $msg_data['icon']['size'] : 'md',
            ),
        );

        // İnceltilmiş fallback: Yalnızca Message_Renderer mevcutsa render et; aksi halde düz metin dön
        if ( ! $this->message_renderer ) {
            return esc_html( $message['text'] );
        }
        ob_start();
        $this->message_renderer->render_messages( array( $message ) );
        return ob_get_clean();
    }

    /**
     * BOGO kampanyası için ürün bazında doğru mesajı seç
     * 
     * @param int $product_id Ürün ID
     * @param array $rule Kural verisi
     * @return array|null Mesaj verisi veya null
     */
    private function resolve_bogo_message_for_product( $product_id, $rule ) {
        // Önce discount engine'den gelen rol bilgisini kontrol et (performans için)
        if ( isset($rule['_bogo_role']) && is_array($rule['_bogo_role']) ) {
            $is_trigger = !empty($rule['_bogo_role']['is_trigger']);
            $is_target = !empty($rule['_bogo_role']['is_target']);
        } else {
            // Fallback: Manuel hesaplama (eski davranış)
            $trigger_products = isset($rule['trigger_products']) ? (array) $rule['trigger_products'] : array();
            $trigger_category = isset($rule['trigger_category']) ? absint($rule['trigger_category']) : 0;
            $target_products = isset($rule['target_products']) ? (array) $rule['target_products'] : array();
            $target_category = isset($rule['target_category']) ? absint($rule['target_category']) : 0;
            
            $is_trigger = false;
            $is_target = false;
            
            // Ürün kontrolü
            if ( ! empty( $trigger_products ) && in_array( $product_id, $trigger_products, true ) ) {
                $is_trigger = true;
            }
            if ( ! empty( $target_products ) && in_array( $product_id, $target_products, true ) ) {
                $is_target = true;
            }
            
            // Kategori kontrolü (sadece gerekirse)
            if ( ! $is_trigger || ! $is_target ) {
                $product_cats = wc_get_product_term_ids( $product_id, 'product_cat' );
                if ( ! empty( $product_cats ) ) {
                    $expanded_product_cats = array_map( 'intval', $product_cats );
                    foreach ( $product_cats as $cat_id ) {
                        $ancestors = get_ancestors( (int) $cat_id, 'product_cat', 'taxonomy' );
                        if ( ! empty( $ancestors ) ) {
                            $expanded_product_cats = array_merge( $expanded_product_cats, array_map( 'intval', $ancestors ) );
                        }
                    }
                    $expanded_product_cats = array_unique( $expanded_product_cats );
                    
                    if ( ! $is_trigger && $trigger_category ) {
                        $is_trigger = in_array( $trigger_category, $expanded_product_cats, true );
                    }
                    if ( ! $is_target && $target_category ) {
                        $is_target = in_array( $target_category, $expanded_product_cats, true );
                    }
                }
            }
        }
        
        // Mesaj seçim mantığı (Tetikleyici Öncelikli)
        if ( $is_trigger && !empty($rule['messages']['product_trigger']) ) {
            return $rule['messages']['product_trigger'];
        } elseif ( $is_target && !empty($rule['messages']['product_target']) ) {
            return $rule['messages']['product_target'];
        }
        
        // Fallback: Standart mesaj
        return isset($rule['messages']['product']) ? $rule['messages']['product'] : null;
    }

    /**
     * Sepet, mini sepet ve ödeme gibi sepet bazlı konumlarda gösterilecek
     * onay mesajlarını alır.
     */
    private function get_applicable_messages_for_location( $location_key ) {
        if ( $this->message_service ) {
            return $this->message_service->get_applicable_messages_for_location( $location_key );
        }
        return array();
    }

    /**
     * Blok alan için (mini sepet, sepet, ödeme) gösterilecek mesajları
     * global ayarlara göre filtreler. Per-line AÇIK ise kademeli (tier)
     * mesajlar blok alanda bastırılır; sepet-genel kampanyalar (cart_total)
     * blokta kalır. Per-line KAPALI + Blok AÇIK ise tier + cart_total birlikte döner.
     */
    private function get_block_area_messages( $location_key ) {
        // Per-request cache: aynı istek içinde aynı konum için tekrar hesaplamayı önle
        static $cached = array();
        if ( isset( $cached[ $location_key ] ) ) {
            return $cached[ $location_key ];
        }

        $all = $this->get_applicable_messages_for_location( $location_key );

        // Ayarları oku (varsayılan: under_item=1, block_area=0)
        $opts  = get_option( 'knsdd_global_settings', array() );
        $under = isset( $opts['cart_msg_under_item'] ) ? (int) !! $opts['cart_msg_under_item'] : 1;
        $block = isset( $opts['cart_msg_block_area'] ) ? (int) !! $opts['cart_msg_block_area'] : 0;

        $tier = array();
        $cart_total = array();
        foreach ( (array) $all as $m ) {
            $scope = isset( $m['scope'] ) ? $m['scope'] : 'tier';
            if ( $scope === 'cart_total' || $scope === 'cart_total_smart' ) {
                $cart_total[] = $m;
            } else {
                $tier[] = $m;
            }
        }

        // Varsayılan: her zaman cart_total mesajları blokta görünebilir
        $result = $cart_total;

        // Per-line kapalı VE blok açık ise, tier mesajlarını da blokta göster
        if ( ! $under && $block ) {
            $result = array_merge( $tier, $result );
        }

        // Sonucu cache'le ve döndür
        $cached[ $location_key ] = $result;
        return $result;
    }

    /**
     * Sepet/Ödeme ürün adı sonuna per-line kademeli mesaj ekler.
     */
    public function filter_cart_item_name_append_line_msg( $product_name, $cart_item, $cart_item_key = '' ) {
        if ( class_exists('KNSDD_Data') && method_exists('KNSDD_Data','is_globally_enabled') ) {
            if ( ! KNSDD_Data::is_globally_enabled() ) { return $product_name; }
        }
        // Ayar: per-line açık değilse dokunma
        $opts  = get_option( 'knsdd_global_settings', array() );
        $under = isset( $opts['cart_msg_under_item'] ) ? (int) !! $opts['cart_msg_under_item'] : 1;
        if ( ! $under ) { return $product_name; }

        // Konum anahtarı: checkout'ta 'show_checkout', diğerinde 'show_cart'
        $location_key = ( function_exists('is_checkout') && is_checkout() ) ? 'show_checkout' : 'show_cart';

        // Ürün-bazlı mesaj haritasını bir kez oluştur
        static $cache = array();
        if ( ! isset( $cache[ $location_key ] ) ) {
            $cache[ $location_key ] = $this->message_service ? $this->message_service->get_item_scoped_messages_map( $location_key ) : array();
        }
        $map = $cache[ $location_key ];

        $pid = isset( $cart_item['product_id'] ) ? (int) $cart_item['product_id'] : 0;
        if ( $pid <= 0 || empty( $map[ $pid ] ) ) { return $product_name; }

        // Mesaj(lar)ın HTML'ini üret ve ürün adına ekle
        if ( $this->message_renderer && method_exists( $this->message_renderer, 'get_line_message_html' ) ) {
            $chunk = '';
            $messages = $map[ $pid ];
            // Tek mesaj nesnesini diziye sar (geriye-dönük tolerans / mixed yapı)
            if ( isset( $messages['text'] ) || isset( $messages['icon'] ) ) {
                $messages = array( $messages );
            }
            if ( is_array( $messages ) ) {
                foreach ( $messages as $m ) {
                    $h = $this->message_renderer->get_line_message_html( $m );
                    if ( $h ) { $chunk .= $h; }
                }
            }
            if ( $chunk ) {
                return $product_name . $chunk;
            }
        }
        return $product_name;
    }

    /**
     * Mini sepet ürün adı sonuna per-line kademeli mesaj ekler.
     */
    public function filter_mini_cart_item_name_append_line_msg( $item_name, $cart_item, $cart_item_key = '' ) {
        if ( class_exists('KNSDD_Data') && method_exists('KNSDD_Data','is_globally_enabled') ) {
            if ( ! KNSDD_Data::is_globally_enabled() ) { return $item_name; }
        }
        $opts  = get_option( 'knsdd_global_settings', array() );
        $under = isset( $opts['cart_msg_under_item'] ) ? (int) !! $opts['cart_msg_under_item'] : 1;
        if ( ! $under ) { return $item_name; }

        $location_key = 'show_mini';
        static $cache = array();
        if ( ! isset( $cache[ $location_key ] ) ) {
            $cache[ $location_key ] = $this->message_service ? $this->message_service->get_item_scoped_messages_map( $location_key ) : array();
        }
        $map = $cache[ $location_key ];

        $pid = isset( $cart_item['product_id'] ) ? (int) $cart_item['product_id'] : 0;
        if ( $pid <= 0 || empty( $map[ $pid ] ) ) { return $item_name; }

        if ( $this->message_renderer && method_exists( $this->message_renderer, 'get_line_message_html' ) ) {
            $chunk = '';
            $messages = $map[ $pid ];
            if ( isset( $messages['text'] ) || isset( $messages['icon'] ) ) {
                $messages = array( $messages );
            }
            if ( is_array( $messages ) ) {
                foreach ( $messages as $m ) {
                    $h = $this->message_renderer->get_line_message_html( $m );
                    if ( $h ) { $chunk .= $h; }
                }
            }
            if ( $chunk ) {
                return $item_name . $chunk;
            }
        }
        return $item_name;
    }

    /**
     * Shortcode: [knsdd_tier_table]
     * Elementor Shortcode widget'ı ile kesin konumda kademe tablo konteynerini basar.
     * Varsayılan olarak data-fixed="1" ile gelir; relocator bu konteyneri taşımayı denemez.
     * Parametreler:
     * - product_id: Opsiyonel; boşsa global ürün kullanılır
     * - fixed: "1"|"0"; 1 ise relocator hareket ettirmez (varsayılan 1)
     */
    public function shortcode_tier_table( $atts = array() ) {
        // Global aktiflik kontrolü ve tablo etkin mi
        if ( class_exists('KNSDD_Data') && method_exists('KNSDD_Data','is_globally_enabled') ) {
            if ( ! KNSDD_Data::is_globally_enabled() ) { return ''; }
        }
        $opts = get_option( 'knsdd_global_settings', array() );
        $enabled = isset( $opts['tier_table_enabled'] ) ? (int) !! $opts['tier_table_enabled'] : 1;
        if ( ! $enabled ) { return ''; }

        $atts = shortcode_atts( array(
            'product_id' => 0,
            'fixed'      => '1',
        ), $atts, 'knsdd_tier_table' );

        $product_id = intval( $atts['product_id'] );
        if ( $product_id <= 0 ) {
            global $product;
            if ( ! is_a( $product, 'WC_Product' ) ) { return ''; }
            $product_id = $product->get_id();
        }

        $container_id = 'knsdd-tier-' . $product_id . '-' . wp_generate_uuid4();
        $fixed_attr = ( isset( $atts['fixed'] ) && (string) $atts['fixed'] === '0' ) ? '' : ' data-fixed="1"';

        // Kanca ile ikinci kez basılmasını önle
        $this->tier_table_shown = true;

        return '<div class="knsdd-tier-table-container" id="' . esc_attr( $container_id ) . '" data-parent-id="' . esc_attr( $product_id ) . '" data-product-id="' . esc_attr( $product_id ) . '"' . $fixed_attr . '></div>';
    }

    public function display_messages_in_mini_cart() {
        if ( class_exists('KNSDD_Data') && method_exists('KNSDD_Data','is_globally_enabled') ) {
            if ( ! KNSDD_Data::is_globally_enabled() ) { return; }
        }
        $messages = $this->get_block_area_messages( 'show_mini_cart' );
        // Mini sepet: düz metin yapısı içinde ikonlara izin ver (render_plain_text_messages ikonları destekler)
        if ( $this->cart_presenter && $this->message_renderer ) {
            $this->cart_presenter->present_mini_cart_inline( $messages, $this->message_renderer );
        } else if ( $this->message_renderer ) {
            $this->message_renderer->render_plain_text_messages( $messages );
        }
    }
    // Removed: mini cart discount fee row output by request.

    /**
     * Ön yüzde gerekli stilleri yükler.
     * JavaScript artık gerekli değil (WooCommerce native notifications kullanılıyor).
     */
    public function enqueue_frontend_assets() {
        // Delegasyon: Frontend_Assets sınıfı mevcutsa onu kullan
        if ( $this->frontend_assets ) {
            $this->frontend_assets->enqueue_frontend_assets();
            return;
        }

        // Fallback: Orijinal gövde
        if ( function_exists( 'is_woocommerce' ) && 
             ( is_woocommerce() || is_cart() || is_checkout() || is_account_page() || 
               is_shop() || is_product_category() || is_product_tag() || is_product() ) ) {
            
            wp_enqueue_style(
                'knsdd-frontend-css',
                plugins_url( '../assets/css/components.css', __FILE__ ),
                array(),
                defined('KNSDD_VERSION') ? KNSDD_VERSION : '1.0.0'
            );
            wp_enqueue_style(
                'knsdd-vendors-overrides-css',
                plugins_url( '../assets/css/vendors-overrides.css', __FILE__ ),
                array('knsdd-frontend-css'),
                defined('KNSDD_VERSION') ? KNSDD_VERSION : '1.0.0'
            );
            // Iconify - Yerel dosya (WordPress.org uyumluluğu)
            wp_enqueue_script(
                'iconify',
                plugins_url( 'assets/js/vendor/iconify.min.js', KNSDD_PLUGIN_FILE ),
                array(),
                '3.1.1',
                true
            );
        }
        // JavaScript yüklemesi kaldırıldı - artık tablo konumlandırma gerekmez
    }

    /**
     * Checkout sayfasında uyarıları ekler (wc_print_notices öncesi).
     */
    public function add_checkout_notices() {
        if ( class_exists('KNSDD_Data') && method_exists('KNSDD_Data','is_globally_enabled') ) {
            if ( ! KNSDD_Data::is_globally_enabled() ) { return; }
        }
        $messages = $this->get_block_area_messages( 'show_checkout' );
        if ( empty( $messages ) ) { return; }
        if ( $this->checkout_notices_controller ) {
            $this->checkout_notices_controller->show_primary( $messages, $this->wc_notice_presenter, $this->message_renderer );
            return;
        }
        if ( $this->wc_notice_presenter && $this->message_renderer ) {
            $this->wc_notice_presenter->present_checkout_notices( $messages, $this->message_renderer );
        } else if ( $this->message_renderer ) {
            $this->message_renderer->render_wc_notices( $messages );
        }
    }

    /**
     * Strikethrough ayarının aktif olup olmadığını kontrol eder (static cache ile).
     * 
     * @return bool
     */
    private static function is_strikethrough_enabled() {
        static $enabled = null;
        if ( $enabled === null ) {
            $options = get_option( 'knsdd_global_settings', array() );
            $enabled = ! empty( $options['strikethrough_price_enabled'] );
        }
        return $enabled;
    }

    /**
     * Mini Sepet ve Sepet sayfasında birim fiyatı üstü çizili gösterir.
     * 
     * @param string $price_html Mevcut fiyat HTML'i
     * @param array $cart_item Sepet ürün verisi
     * @param string $cart_item_key Sepet ürün anahtarı
     * @return string Değiştirilmiş fiyat HTML'i
     */
    public function strikethrough_cart_item_price( $price_html, $cart_item, $cart_item_key ) {
        // Global pasif kontrolü
        if ( class_exists('KNSDD_Data') && method_exists('KNSDD_Data','is_globally_enabled') ) {
            if ( ! KNSDD_Data::is_globally_enabled() ) { return $price_html; }
        }
        
        // Ayar kontrolü (static cache)
        if ( ! self::is_strikethrough_enabled() ) {
            return $price_html;
        }
        
        // İndirim uygulanmış mı kontrol et
        if ( empty( $cart_item['knsdd_original_unit_price'] ) || empty( $cart_item['knsdd_discounted_unit_price'] ) ) {
            return $price_html;
        }
        
        $original_price = (float) $cart_item['knsdd_original_unit_price'];
        $discounted_price = (float) $cart_item['knsdd_discounted_unit_price'];
        
        // Fiyat değişmemişse orijinal HTML'i döndür
        if ( $original_price <= $discounted_price ) {
            return $price_html;
        }
        
        // WooCommerce standart yapısında üstü çizili format
        return sprintf(
            '<del aria-hidden="true">%s</del> <ins>%s</ins>',
            wc_price( $original_price ),
            wc_price( $discounted_price )
        );
    }

    /**
     * Sepet ve Checkout sayfasında satır toplamını üstü çizili gösterir.
     * 
     * @param string $subtotal_html Mevcut ara toplam HTML'i
     * @param array $cart_item Sepet ürün verisi
     * @param string $cart_item_key Sepet ürün anahtarı
     * @return string Değiştirilmiş ara toplam HTML'i
     */
    public function strikethrough_cart_item_subtotal( $subtotal_html, $cart_item, $cart_item_key ) {
        // Global pasif kontrolü
        if ( class_exists('KNSDD_Data') && method_exists('KNSDD_Data','is_globally_enabled') ) {
            if ( ! KNSDD_Data::is_globally_enabled() ) { return $subtotal_html; }
        }
        
        // Ayar kontrolü (static cache)
        if ( ! self::is_strikethrough_enabled() ) {
            return $subtotal_html;
        }
        
        // İndirim uygulanmış mı kontrol et
        if ( empty( $cart_item['knsdd_original_unit_price'] ) || empty( $cart_item['knsdd_discounted_unit_price'] ) ) {
            return $subtotal_html;
        }
        
        $original_price = (float) $cart_item['knsdd_original_unit_price'];
        $discounted_price = (float) $cart_item['knsdd_discounted_unit_price'];
        $quantity = isset( $cart_item['quantity'] ) ? (int) $cart_item['quantity'] : 1;
        
        // Fiyat değişmemişse orijinal HTML'i döndür
        if ( $original_price <= $discounted_price ) {
            return $subtotal_html;
        }
        
        // Satır toplamları hesapla
        $original_subtotal = $original_price * $quantity;
        $discounted_subtotal = $discounted_price * $quantity;
        
        // WooCommerce standart yapısında üstü çizili format
        return sprintf(
            '<del aria-hidden="true">%s</del> <ins>%s</ins>',
            wc_price( $original_subtotal ),
            wc_price( $discounted_subtotal )
        );
    }

    /**
     * Mini sepette ürün miktarı ve fiyatı üstü çizili gösterir.
     * 
     * @param string $quantity_html Mevcut miktar HTML'i (örn: "5 × 1.050₺")
     * @param array $cart_item Sepet ürün verisi
     * @param string $cart_item_key Sepet ürün anahtarı
     * @return string Değiştirilmiş miktar HTML'i
     */
    public function strikethrough_mini_cart_item_quantity( $quantity_html, $cart_item, $cart_item_key ) {
        // Global pasif kontrolü
        if ( class_exists('KNSDD_Data') && method_exists('KNSDD_Data','is_globally_enabled') ) {
            if ( ! KNSDD_Data::is_globally_enabled() ) { return $quantity_html; }
        }
        
        // Ayar kontrolü (static cache)
        if ( ! self::is_strikethrough_enabled() ) {
            return $quantity_html;
        }
        
        // İndirim uygulanmış mı kontrol et
        if ( empty( $cart_item['knsdd_original_unit_price'] ) || empty( $cart_item['knsdd_discounted_unit_price'] ) ) {
            return $quantity_html;
        }
        
        $original_price = (float) $cart_item['knsdd_original_unit_price'];
        $discounted_price = (float) $cart_item['knsdd_discounted_unit_price'];
        $quantity = isset( $cart_item['quantity'] ) ? (int) $cart_item['quantity'] : 1;
        
        // Fiyat değişmemişse orijinal HTML'i döndür
        if ( $original_price <= $discounted_price ) {
            return $quantity_html;
        }
        
        // Mini sepet formatı: "5 × <del>1.300₺</del> <ins>1.050₺</ins>"
        return sprintf(
            '<span class="quantity">%d <span class="times">&times;</span> <del aria-hidden="true">%s</del> <ins>%s</ins></span>',
            $quantity,
            wc_price( $original_price ),
            wc_price( $discounted_price )
        );
    }

    // Ürün promosyon mesajı tekrarını önlemek için guard
    private $product_promo_shown = false;
    private $tier_table_shown = false;

}
