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

class KNSDD_Message_Service {
    /** @var KNSDD_Campaign_Validator|null */
    private $campaign_validator;
    
    /** @var KNSDD_Smart_Message_Service|null */
    private $smart_message_service;

    public function __construct( $campaign_validator = null ) {
        $this->campaign_validator = $campaign_validator instanceof KNSDD_Campaign_Validator ? $campaign_validator : null;
        
        // Akıllı mesaj servisini başlat
        if ( class_exists( 'KNSDD_Smart_Message_Service' ) ) {
            $this->smart_message_service = new KNSDD_Smart_Message_Service();
        }
    }

    /**
     * Sepet, mini sepet ve ödeme gibi sepet bazlı konumlarda gösterilecek
     * onay mesajlarını alır.
     */
    public function get_applicable_messages_for_location( $location_key ) {
        if ( ! WC()->cart || WC()->cart->is_empty() ) {
            return array();
        }

        $messages = array();
        
        // ÖNCELİKLE: Akıllı mesajı kontrol et (Sepet Tutarına Göre İndirim için)
        if ( $this->smart_message_service ) {
            $smart_message = $this->smart_message_service->get_smart_message_for_location( $location_key );
            if ( $smart_message ) {
                // Akıllı mesaj varsa, sadece onu döndür (diğer cart_total mesajlarını gösterme)
                return array( $smart_message );
            }
        }
        $processed_rules = array(); // Aynı kuralın birden fazla kez işlenmesini önle
        
        // BOGO kurallarını ayrıca kontrol et
        $bogo_rules = $this->get_applicable_bogo_rules_for_cart();
        
        foreach ( WC()->cart->get_cart() as $cart_item ) {
            $product_id = $cart_item['product_id'];
            $quantity   = $cart_item['quantity'];

            $rule = KNSDD_Discount_Engine::get_best_applicable_rule( $product_id, $quantity );
            
            // BOGO kuralı varsa onu da kontrol et
            if ( ! $rule && ! empty( $bogo_rules ) ) {
                foreach ( $bogo_rules as $bogo_rule ) {
                    $target_products = isset( $bogo_rule['target_products'] ) && is_array( $bogo_rule['target_products'] ) ? $bogo_rule['target_products'] : array();
                    $target_category = isset( $bogo_rule['target_category'] ) ? absint( $bogo_rule['target_category'] ) : 0;
                    
                    // Ürün öncelikli kontrol (ürün sayfası ile tutarlı)
                    $is_target = false;
                    if ( ! empty( $target_products ) && in_array( $product_id, $target_products, true ) ) {
                        $is_target = true;
                    } elseif ( empty( $target_products ) && $target_category > 0 ) {
                        // Kategori kontrolü: SADECE ürün listesi boşsa
                        $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 );
                            $is_target = in_array( $target_category, $expanded_product_cats, true );
                        }
                    }
                    
                    if ( $is_target ) {
                        // Validator kontrolü: Kampanya koşulları sağlanıyor mu?
                        if ( ! $this->campaign_validator || ! $this->campaign_validator->is_special_campaign_applicable_for_cart( $bogo_rule ) ) {
                            continue; // Validator yok veya koşullar sağlanmadı, bu kuralı atlat
                        }
                        $rule = $bogo_rule;
                        break;
                    }
                }
            }
            
            if ( $rule && ! empty( $rule['messages']['cart'] ) ) {
                $rule_id = $rule['rule_id'] ?? '';
                
                // Aynı kuralı tekrar işleme
                if ( in_array( $rule_id, $processed_rules ) ) {
                    continue;
                }
                $processed_rules[] = $rule_id;
                
                // Özel kampanyalar için ek validasyon
                if ( isset( $rule['rule_type'] ) && 'special_campaign' === $rule['rule_type'] ) {
                    // BOGO: Sadece hedef ürünler için sepet mesajı göster
                    if ( isset( $rule['campaign_type'] ) && $rule['campaign_type'] === 'buy_x_get_y_discount' ) {
                        $target_products = isset( $rule['target_products'] ) && is_array( $rule['target_products'] ) ? $rule['target_products'] : array();
                        $target_category = isset( $rule['target_category'] ) ? absint( $rule['target_category'] ) : 0;
                        
                        // Ürün öncelikli kontrol (ürün sayfası ile tutarlı)
                        $is_target = false;
                        if ( ! empty( $target_products ) && in_array( $product_id, $target_products, true ) ) {
                            $is_target = true;
                        } elseif ( empty( $target_products ) && $target_category > 0 ) {
                            // Kategori kontrolü: SADECE ürün listesi boşsa
                            $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 );
                                $is_target = in_array( $target_category, $expanded_product_cats, true );
                            }
                        }
                        
                        if ( ! $is_target ) {
                            continue; // Tetikleyici ürün, sepet mesajı gösterme
                        }
                    }
                    
                    // Validator servisinden kontrol et
                    if ( ! $this->campaign_validator || ! $this->campaign_validator->is_special_campaign_applicable_for_cart( $rule ) ) {
                        continue; // Validator yok veya kampanya koşulları karşılanmadı, mesajı gösterme
                    }
                }
                
                $msg_data = $rule['messages']['cart'];
                // İlgili konumda gösterim aktif mi ve sepet mesajı dolu mu?
                if ( ! empty( $msg_data[ $location_key ] ) && ! empty( $msg_data['text'] ) ) {
                    
                    // Aynı mesajın tekrar eklenmesini önle
                    if ( ! in_array( $msg_data['text'], array_column( $messages, 'text' ) ) ) {
                        $messages[] = array(
                            'text'      => $msg_data['text'],
                            'color'     => isset( $msg_data['color'] ) ? $msg_data['color'] : '',
                            // Tekil highlight (geri uyumluluk için üçlü alanlar varsa OR ile zaten ajax tarafında toplanıyor)
                            'highlight' => ! empty( $msg_data['highlight'] ),
                            // styles kaldırıldı; highlight = kalın
                            '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',
                            ),
                            'scope'     => 'tier',
                        );
                    }
                }
            }
        }
        // NOT: Sepet Tutarına Göre İndirim mesajları artık Smart Message Service tarafından yönetiliyor
        // Yukarıdaki akıllı mesaj kontrolü bu bölümü otomatik olarak yönetiyor
        return $messages;
    }
    
    /**
     * Sepet için geçerli BOGO kurallarını al (cache'li)
     */
    private function get_applicable_bogo_rules_for_cart() {
        // Request-level cache
        static $cached_bogo_rules = null;
        
        if ( $cached_bogo_rules !== null ) {
            return $cached_bogo_rules;
        }
        
        $all_groups = KNSDD_Data::get_groups();
        $all_group_dates = KNSDD_Data::get_all_group_dates();
        
        $bogo_rules = [];
        foreach ( $all_groups as $group ) {
            if ( KNSDD_Data::is_group_paused( $group ) ) {
                continue;
            }
            
            $dates = isset( $all_group_dates[ $group ] ) ? $all_group_dates[ $group ] : null;
            if ( ! $dates || 'open' !== KNSDD_Utils::get_group_status_info( $dates )['status'] ) {
                continue;
            }
            
            $rules = KNSDD_Data::get_rules_for_group( $group );
            foreach ( $rules as $rule ) {
                if ( isset( $rule['rule_type'] ) 
                    && $rule['rule_type'] === 'special_campaign'
                    && isset( $rule['campaign_type'] )
                    && $rule['campaign_type'] === 'buy_x_get_y_discount' ) {
                    $rule['group'] = $group;
                    $bogo_rules[] = $rule;
                }
            }
        }
        
        $cached_bogo_rules = $bogo_rules;
        return $bogo_rules;
    }

    /**
     * ÜRÜN-BAZLI (per-line) mesaj haritası döndürür.
     * Key: product_id => array of message arrays (scope = 'tier')
     * Standart kademeli kuralların yanı sıra, admin ayarı AÇIK ise ürün-bazlı özel kampanya
     * mesajlarını da (örn. buy_x_pay_y, nth_percent_off) içerir. cart_total_discount bu haritaya
     * dahil edilmez (blok alanda kalır).
     */
    public function get_item_scoped_messages_map( $location_key ) {
        $map = array();
        if ( ! WC()->cart || WC()->cart->is_empty() ) {
            return $map;
        }

        // 1) Sepeti product_id bazında grupla ve miktarları topla
        $qty_by_product = array();
        foreach ( WC()->cart->get_cart() as $ci ) {
            $pid = isset( $ci['product_id'] ) ? (int) $ci['product_id'] : 0;
            if ( $pid <= 0 ) { continue; }
            $qty_by_product[ $pid ] = ( isset( $qty_by_product[ $pid ] ) ? $qty_by_product[ $pid ] : 0 ) + (int) ( $ci['quantity'] ?? 1 );
        }

        if ( empty( $qty_by_product ) ) { return $map; }

        // BOGO kurallarını ayrıca kontrol et
        $bogo_rules = $this->get_applicable_bogo_rules_for_cart();
        
        // 2) Her ürün için en uygun kuralı bul ve per-line mesaj(lar)ı üret
        $opts = get_option( 'knsdd_global_settings', array() );
        // Varsayılan: özel kampanyaları ürün altına dahil et (admin varsayılanı AÇIK)
        $special_under = isset( $opts['special_msg_under_item'] ) ? (int) !! $opts['special_msg_under_item'] : 1;
        foreach ( $qty_by_product as $pid => $sum_qty ) {
            $rule = KNSDD_Discount_Engine::get_best_applicable_rule( $pid, (int) $sum_qty );
            
            // BOGO kuralı varsa onu da kontrol et
            if ( ! $rule && ! empty( $bogo_rules ) ) {
                foreach ( $bogo_rules as $bogo_rule ) {
                    $target_products = isset( $bogo_rule['target_products'] ) && is_array( $bogo_rule['target_products'] ) ? $bogo_rule['target_products'] : array();
                    $target_category = isset( $bogo_rule['target_category'] ) ? absint( $bogo_rule['target_category'] ) : 0;
                    
                    // Ürün öncelikli kontrol (ürün sayfası ile tutarlı)
                    $is_target = false;
                    if ( ! empty( $target_products ) && in_array( $pid, $target_products, true ) ) {
                        $is_target = true;
                    } elseif ( empty( $target_products ) && $target_category > 0 ) {
                        // Kategori kontrolü: SADECE ürün listesi boşsa
                        $product_cats = wc_get_product_term_ids( $pid, '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 );
                            $is_target = in_array( $target_category, $expanded_product_cats, true );
                        }
                    }
                    
                    if ( $is_target ) {
                        // Validator kontrolü: Kampanya koşulları sağlanıyor mu?
                        if ( ! $this->campaign_validator || ! $this->campaign_validator->is_special_campaign_applicable_for_cart( $bogo_rule ) ) {
                            continue; // Validator yok veya koşullar sağlanmadı, bu kuralı atlat
                        }
                        $rule = $bogo_rule;
                        break;
                    }
                }
            }
            
            if ( ! $rule ) { continue; }

            // Özel kampanyalar: admin kapalıysa veya cart_total_discount ise per-line'a dahil etme
            $is_special = ( isset( $rule['rule_type'] ) && $rule['rule_type'] === 'special_campaign' );
            $campaign_type = isset( $rule['campaign_type'] ) ? $rule['campaign_type'] : '';
            if ( $is_special ) {
                if ( ! $special_under ) { continue; }
                if ( $campaign_type === 'cart_total_discount' ) { continue; }
                
                // BOGO: Sadece hedef ürünler için mesaj göster
                if ( $campaign_type === 'buy_x_get_y_discount' ) {
                    $target_products = isset( $rule['target_products'] ) && is_array( $rule['target_products'] ) ? $rule['target_products'] : array();
                    $target_category = isset( $rule['target_category'] ) ? absint( $rule['target_category'] ) : 0;
                    
                    // Ürün öncelikli kontrol (ürün sayfası ile tutarlı)
                    $is_target = false;
                    if ( ! empty( $target_products ) && in_array( $pid, $target_products, true ) ) {
                        $is_target = true;
                    } elseif ( empty( $target_products ) && $target_category > 0 ) {
                        // Kategori kontrolü: SADECE ürün listesi boşsa
                        $product_cats = wc_get_product_term_ids( $pid, '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 );
                            $is_target = in_array( $target_category, $expanded_product_cats, true );
                        }
                    }
                    
                    if ( ! $is_target ) {
                        continue; // Tetikleyici ürün, per-line mesaj gösterme
                    }
                }
                
                // Uygulanabilirlik doğrulaması (ürün bazlı)
                if ( ! $this->campaign_validator || ! $this->campaign_validator->is_special_campaign_applicable_for_product( $rule, $pid, $sum_qty ) ) {
                    continue;
                }
            }
            if ( empty( $rule['messages']['cart'] ) ) { continue; }
            $msg_data = $rule['messages']['cart'];
            if ( empty( $msg_data[ $location_key ] ) || empty( $msg_data['text'] ) ) { continue; }
            if ( ! isset( $map[ $pid ] ) || ! is_array( $map[ $pid ] ) ) { $map[ $pid ] = array(); }
            $map[ $pid ][] = 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',
                ),
                'scope'     => 'tier',
            );
        }

        return $map;
    }
}
