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

/**
 * KNSDD_Discount_Engine Class
 *
 * Eklentinin indirim hesaplama ve kural bulma mantığını yönetir.
 */
class KNSDD_Discount_Engine {

    /**
     * Kural kategorilerini genişletir: Üst kategori seçiliyse tüm alt kategorileri dahil eder.
     * Performans: Sonuçları 1 saatliğine önbelleğe alır.
     * 
     * @param array $rule_category_ids Kuralda seçilen kategori ID'leri
     * @return array Genişletilmiş kategori ID'leri (kendisi + tüm alt kategoriler)
     */
    private static function expand_rule_categories( $rule_category_ids ) {
        if ( empty( $rule_category_ids ) ) {
            return [];
        }
        
        // Önbellek kontrolü
        $cache_key = 'knsdd_rule_cat_exp_' . md5( implode( ',', $rule_category_ids ) );
        $cached = get_transient( $cache_key );
        if ( false !== $cached ) {
            return $cached;
        }
        
        $expanded = array_map( 'intval', $rule_category_ids );
        
        // Her üst kategori için tüm alt kategorileri bul (recursive)
        foreach ( $rule_category_ids as $cat_id ) {
            $cat_id = (int) $cat_id;
            
            // Alt kategorileri ekle (üst → alt)
            $children = get_term_children( $cat_id, 'product_cat' );
            if ( ! is_wp_error( $children ) && ! empty( $children ) ) {
                $expanded = array_merge( $expanded, array_map( 'intval', $children ) );
            }
        }
        
        $expanded = array_unique( $expanded );
        set_transient( $cache_key, $expanded, HOUR_IN_SECONDS );
        
        return $expanded;
    }

    /**
     * Verilen ürün ve miktar için en uygun miktar indirimi kuralını bulur.
     * Sonuçları 1 saatliğine önbelleğe alır.
     * 
     * PERFORMANS OPTİMİZASYONU: Mümkünse Performance Optimizer kullanır.
     */
    public static function get_best_applicable_rule( $product_id, $quantity ) {
        // Optimize edilmiş batch processing varsa onu kullan
        if ( class_exists( 'KNSDD_Performance_Optimizer' ) && WC()->cart && ! WC()->cart->is_empty() ) {
            try {
                $cart_data = KNSDD_Performance_Optimizer::batch_load_cart_rules();
                
                // Bu ürün sepette var mı ve kuralı bulunmuş mu?
                foreach ( $cart_data as $data ) {
                    if ( $data['product_id'] == $product_id && $data['quantity'] >= $quantity ) {
                        // Kural bulundu ve geçerli ise döndür
                        if ( $data['rule'] !== null ) {
                            return $data['rule'];
                        }
                    }
                }
                
                // Batch processing çalıştı ama bu ürün için kural bulunamadı
                // Fallback'e geçmek yerine null döndür (cache'lenmiş sonuç)
                if ( ! empty( $cart_data ) ) {
                    return null;
                }
            } catch ( Exception $e ) {
                // Batch processing başarısız - fallback'e geç (sessizce devam et)
            }
        }
        
        // Fallback: Eski yöntem (tek ürün için)
        if ( ! KNSDD_Data::is_globally_enabled() ) {
            return null;
        }

        // Optimize edilmiş kullanıcı kimlik bilgilerini al
        $identity = class_exists('KNSDD_Performance_Optimizer') 
            ? KNSDD_Performance_Optimizer::get_user_identity()
            : ['user_id' => get_current_user_id(), 'email' => ''];
        $current_user_id = $identity['user_id'];
        $current_user_email = $identity['email'];

        $cache_version = get_option( 'knsdd_cache_version', 1 );
        // Önbellek anahtarı kullanıcıya (ID+email hash) ve versiyona özel olmalı.
        $email_hash = $current_user_email ? md5( $current_user_email ) : 'noeml';
        $cache_key = 'knsdd_br_' . $product_id . '_' . $quantity . '_' . $current_user_id . '_' . $email_hash . '_' . $cache_version;
        $cached_rule = get_transient( $cache_key );

        if ( false !== $cached_rule ) {
            // Önbellekte 'kural yok' olarak işaretlenmişse null döndür.
            return '--no-rule--' === $cached_rule ? null : $cached_rule;
        }

        $product = wc_get_product( $product_id ); if ( ! $product ) { return null; }
        $product_cats = wc_get_product_term_ids( $product_id, 'product_cat' );
        
        // Optimize edilmiş grup ve tarih verilerini al
        $groups_data = class_exists('KNSDD_Performance_Optimizer') 
            ? KNSDD_Performance_Optimizer::get_groups_and_dates()
            : ['groups' => KNSDD_Data::get_groups(), 'dates' => KNSDD_Data::get_all_group_dates()];
        $all_groups = $groups_data['groups'];
        $all_group_dates = $groups_data['dates'];

        // 1. Aday Kuralları Seç (kullanım limitleri hariç)
        $candidate_rules = [];
        foreach ( $all_groups as $group ) {
            if ( KNSDD_Data::is_group_paused( $group ) ) { continue; }
            $dates = $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 (empty($rule['rule_id'])) continue;

                $rule_applies_to_product = false;
                $rule_cats = isset($rule['category']) ? (array)$rule['category'] : [];
                $rule_products = ( ! empty( $rule['product'] ) && is_array( $rule['product'] ) ) ? $rule['product'] : [];
                // Varyasyonlar için ebeveyn kategorilerini devral (ürün kategorileri boşsa)
                $cats_for_match = $product_cats;
                if ( empty( $cats_for_match ) ) {
                    $par = (int) wp_get_post_parent_id( $product_id );
                    if ( $par > 0 ) {
                        $cats_for_match = wc_get_product_term_ids( $par, 'product_cat' );
                    }
                }

                // Çift yönlü hiyerarşik kategori desteği
                if ( ! empty( $rule_cats ) && ! empty( $cats_for_match ) ) {
                    // 1. Kural kategorilerini genişlet (üst → alt)
                    $expanded_rule_cats = self::expand_rule_categories( $rule_cats );
                    
                    // 2. Ürün kategorilerini genişlet (alt → üst)
                    $expanded_product_cats = array_map( 'intval', $cats_for_match );
                    foreach ( $cats_for_match 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 );
                    
                    // 3. Eşleşme kontrolü
                    $has_category_match = ! empty( array_intersect( $expanded_product_cats, $expanded_rule_cats ) );
                    

                } else {
                    $has_category_match = false;
                }

                // Ürün seçimi önceliklidir: Ürün seçiliyse sadece seçili ürünlere uygulanır
                if ( ! empty( $rule_products ) ) {
                    if ( in_array( $product_id, $rule_products ) ) {
                        $rule_applies_to_product = true;
                    }
                } elseif ( ! empty( $rule_cats ) ) {
                    // Ürün seçili değilse kategori kontrolü yap
                    if ( $has_category_match ) {
                        $rule_applies_to_product = true;
                    }
                }
                
                if ( $rule_applies_to_product ) {
                    // Standart kurallar için miktar kontrolü
                    if ( ! isset( $rule['rule_type'] ) || 'special_campaign' !== $rule['rule_type'] ) {
                        if ( $quantity >= (int) $rule['min'] && ( (int) $rule['max'] === 0 || $quantity <= (int) $rule['max'] ) ) { 
                            $rule['group'] = $group;
                            $candidate_rules[] = $rule;
                        }
                    }
                    
                    // Özel kampanyalar (N. ürün, X Al Y Öde) için miktar kontrolsüz ekleme
                    if ( isset( $rule['rule_type'] ) && 'special_campaign' === $rule['rule_type'] ) {
                        $rule['group'] = $group;
                        $candidate_rules[] = $rule;
                    }
                }
            }
        }

        if ( empty( $candidate_rules ) ) {
            set_transient( $cache_key, '--no-rule--', HOUR_IN_SECONDS );
            return null;
        }

        // 2. Tüm aday kuralların kullanım verilerini tek sorguda çek
        $candidate_rule_ids = wp_list_pluck( $candidate_rules, 'rule_id' );
        $usage_rule_ids = [];
        foreach ( $candidate_rule_ids as $rid ) {
            $group_ids = method_exists( 'KNSDD_Data', 'get_tier_group_rule_ids' ) ? KNSDD_Data::get_tier_group_rule_ids( $rid ) : array( $rid );
            foreach ( (array) $group_ids as $gid ) {
                $usage_rule_ids[ (string) $gid ] = true;
            }
        }
        $usage_rule_ids = array_keys( $usage_rule_ids );
        $all_rules_usage = KNSDD_Data::get_usage_for_multiple_rules( $usage_rule_ids );
        $email_usage_map = [];
        if ( ! empty( $current_user_email ) ) {
            $email_usage_map = KNSDD_Data::get_usage_for_multiple_rules_by_email( $usage_rule_ids, $current_user_email );
        }

        // 3. Nihai Filtreleme (kullanım limitleri dahil)
        $applicable_rules = [];
        foreach ( $candidate_rules as $rule ) {
            if ( self::is_rule_conditions_met( $rule, $current_user_id, $all_rules_usage, $current_user_email, $email_usage_map ) ) {
                $applicable_rules[] = $rule;
            }
        }

        if ( empty( $applicable_rules ) ) {
            set_transient( $cache_key, '--no-rule--', HOUR_IN_SECONDS );
            return null;
        }
        
        // 4. En uygun olanı sırala ve döndür
        if ( count( $applicable_rules ) > 1 ) {
            usort( $applicable_rules, function( $a, $b ) {
                $prio_a = isset( $a['priority'] ) ? (int) $a['priority'] : 10;
                $prio_b = isset( $b['priority'] ) ? (int) $b['priority'] : 10;
                if ( $prio_a !== $prio_b ) {
                    return ( $prio_a < $prio_b ) ? 1 : -1; // yüksek öncelik önce
                }
                $val_a = isset( $a['discount_value'] ) ? (float) $a['discount_value'] : 0.0;
                $val_b = isset( $b['discount_value'] ) ? (float) $b['discount_value'] : 0.0;
                if ( $val_a == $val_b ) return 0;
                return ( $val_a < $val_b ) ? 1 : -1; // yüksek indirim önce
            } );
        }
        
        $best_rule = $applicable_rules[0];
        set_transient( $cache_key, $best_rule, HOUR_IN_SECONDS );
        
        return $best_rule;
    }

    /**
     * Verilen sepet toplamı için en uygun "Sepet Tutarına Göre İndirim" kuralını bulur.
     */
    public static function get_best_cart_total_rule( $cart_total ) {
        if ( ! KNSDD_Data::is_globally_enabled() ) {
            return null;
        }

        // Optimize edilmiş grup ve kullanıcı verilerini al
        $groups_data = class_exists('KNSDD_Performance_Optimizer') 
            ? KNSDD_Performance_Optimizer::get_groups_and_dates()
            : ['groups' => KNSDD_Data::get_groups(), 'dates' => KNSDD_Data::get_all_group_dates()];
        $all_groups = $groups_data['groups'];
        $all_group_dates = $groups_data['dates'];
        
        $identity = class_exists('KNSDD_Performance_Optimizer') 
            ? KNSDD_Performance_Optimizer::get_user_identity()
            : ['user_id' => get_current_user_id(), 'email' => ''];
        $current_user_id = $identity['user_id'];
        $current_user_email = $identity['email'];

        // 1. Aday Kuralları Seç
        $candidate_rules = [];
        foreach ( $all_groups as $group ) {
            if ( KNSDD_Data::is_group_paused( $group ) ) { continue; }
            $dates = $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 ( ($rule['rule_type'] ?? '') !== 'special_campaign' || ($rule['campaign_type'] ?? '') !== 'cart_total_discount' ) {
                    continue;
                }
                if ( $cart_total >= floatval( $rule['min_cart_total'] ) ) {
                    $rule['group'] = $group;
                    $candidate_rules[] = $rule;
                }
            }
        }

        if ( empty( $candidate_rules ) ) { return null; }

        // 2. Kullanım verilerini toplu çek
        $candidate_rule_ids = wp_list_pluck( $candidate_rules, 'rule_id' );
        $usage_rule_ids = [];
        foreach ( $candidate_rule_ids as $rid ) {
            $group_ids = method_exists( 'KNSDD_Data', 'get_tier_group_rule_ids' ) ? KNSDD_Data::get_tier_group_rule_ids( $rid ) : array( $rid );
            foreach ( (array) $group_ids as $gid ) {
                $usage_rule_ids[ (string) $gid ] = true;
            }
        }
        $usage_rule_ids = array_keys( $usage_rule_ids );
        $all_rules_usage = KNSDD_Data::get_usage_for_multiple_rules( $usage_rule_ids );

        $email_usage_map = [];
        if ( ! empty( $current_user_email ) ) {
            $email_usage_map = KNSDD_Data::get_usage_for_multiple_rules_by_email( $usage_rule_ids, $current_user_email );
        }

        // 3. Nihai Filtreleme
        $applicable_rules = [];
        foreach($candidate_rules as $rule) {
            if ( self::is_rule_conditions_met( $rule, $current_user_id, $all_rules_usage, $current_user_email, $email_usage_map ) ) {
                $applicable_rules[] = $rule;
            }
        }

        if ( empty( $applicable_rules ) ) { return null; }

        // 4. En uygun olanı sırala ve döndür
        usort( $applicable_rules, function( $a, $b ) use ( $cart_total ) {
            $discount_a = self::calculate_discount_amount( $a, $cart_total );
            $discount_b = self::calculate_discount_amount( $b, $cart_total );
            return ( $discount_a > $discount_b ) ? -1 : 1;
        });

        return $applicable_rules[0];
    }

    /**
     * Bir kuralın temel geçerlilik koşullarını (limitler, müşteri durumu) kontrol eder.
     * @param array $rule Kontrol edilecek kural.
     * @param int $current_user_id Mevcut kullanıcı ID'si.
     * @param array $all_rules_usage Tüm kuralların önceden çekilmiş kullanım verileri.
     * @return bool
     */
    public static function is_rule_conditions_met( $rule, $current_user_id, &$all_rules_usage, $current_user_email = '', $email_usage_map = [] ) {
        if ( empty( $rule['rule_id'] ) ) return false;

        // Kullanıcıya özel koşullar (veritabanı sorgusu gerektirmez)
        if ( ! empty( $rule['allowed_customers'] ) && is_array( $rule['allowed_customers'] ) ) {
            if ( ! $current_user_id || ! in_array( $current_user_id, $rule['allowed_customers'] ) ) {
                return false;
            }
        } elseif ( ! empty( $rule['login_required'] ) && ! $current_user_id ) {
            return false;
        }

        // "İlk Sipariş" koşulu: sadece ilk siparişinde olan, giriş yapmış müşteriler
        // Not: UI tarafında bu seçenek açıldığında "Sadece Üyeler" otomatik işaretleniyor
        // ancak yine de server-side güvence ekliyoruz.
        $first_order_only = false;
        if ( isset( $rule['first_order_only'] ) ) {
            $first_order_only = (bool) $rule['first_order_only'];
        } elseif ( isset( $rule['ext'] ) && is_array( $rule['ext'] ) && isset( $rule['ext']['first_order_only'] ) ) {
            $first_order_only = (bool) $rule['ext']['first_order_only'];
        }

        if ( $first_order_only ) {
            // Tekrarlı sorguyu önlemek için kullanıcı bazlı statik cache
            static $order_count_cache = [];
            static $email_has_orders = []; // PHP 8+ için tek tanım

            if ( $current_user_id > 0 ) {
                if ( ! array_key_exists( $current_user_id, $order_count_cache ) ) {
                    if ( function_exists( 'wc_get_customer_order_count' ) ) {
                        $order_count_cache[ $current_user_id ] = (int) wc_get_customer_order_count( $current_user_id );
                    } else {
                        // Eski kurulumlar için güvenli varsayılan
                        $order_count_cache[ $current_user_id ] = 0;
                    }
                }
                if ( $order_count_cache[ $current_user_id ] > 0 ) {
                    return false; // İlk sipariş değil
                }

                // user_id sipariş sayısı 0 ise ve e-posta mevcutsa, e-posta bazlı geçmiş sipariş kontrolü
                if ( $order_count_cache[ $current_user_id ] === 0 && ! empty( $current_user_email ) && function_exists( 'wc_get_orders' ) ) {
                    $eml = strtolower( sanitize_email( $current_user_email ) );
                    if ( ! array_key_exists( $eml, $email_has_orders ) ) {
                        $valid_statuses = apply_filters( 'knsdd_first_order_valid_statuses', array( 'processing', 'completed', 'on-hold' ) );
                        $ids = wc_get_orders( array(
                            'limit'         => 1,
                            'return'        => 'ids',
                            'status'        => $valid_statuses,
                            'billing_email' => $eml,
                        ) );
                        $email_has_orders[ $eml ] = ! empty( $ids );
                    }
                    if ( $email_has_orders[ $eml ] ) {
                        return false; // E-posta ile geçmiş sipariş bulunduysa ilk sipariş indirimi uygulanmaz
                    }
                }
            } else {
                // Misafir: e-posta yoksa ilk sipariş doğrulanamaz
                if ( empty( $current_user_email ) ) { return false; }
                if ( function_exists( 'wc_get_orders' ) ) {
                    $eml = strtolower( sanitize_email( $current_user_email ) );
                    if ( ! array_key_exists( $eml, $email_has_orders ) ) {
                        $valid_statuses = apply_filters( 'knsdd_first_order_valid_statuses', array( 'processing', 'completed', 'on-hold' ) );
                        $ids = wc_get_orders( array(
                            'limit'         => 1,
                            'return'        => 'ids',
                            'status'        => $valid_statuses,
                            'billing_email' => $eml,
                        ) );
                        $email_has_orders[ $eml ] = ! empty( $ids );
                    }
                    if ( $email_has_orders[ $eml ] ) {
                        return false; // E-posta ile geçmiş sipariş bulundu -> ilk sipariş indirimi uygulanmaz
                    }
                } else {
                    // Güvenli varsayılan: API yoksa misafir için ilk sipariş doğrulanamaz
                    return false;
                }
            }
        }

        // Kural bazlı çerez kontrolü kaldırıldı - sadece veritabanı kontrolü kullanılıyor
        
        // Grup çerez ve grup kilidi kontrolleri kaldırıldı.
        // Artık sadece per_customer_limit ile kural bazlı limit kontrolü yapılıyor.

        // Kullanım limiti kontrolü (önceden çekilmiş veriyi kullanır)
        $group_rule_ids = method_exists( 'KNSDD_Data', 'get_tier_group_rule_ids' ) ? KNSDD_Data::get_tier_group_rule_ids( $rule['rule_id'] ) : array( $rule['rule_id'] );

        $total_limit = (int) ( $rule['total_limit'] ?? 0 );
        if ( $total_limit > 0 ) {
            $group_total = 0;
            $group_members_only_total = 0;
            foreach ( (array) $group_rule_ids as $gid ) {
                $usage = $all_rules_usage[ $gid ] ?? [ 'total' => 0, 'members_only_total' => 0, 'users' => [] ];
                $group_total += isset( $usage['total'] ) ? (int) $usage['total'] : 0;
                $group_members_only_total += isset( $usage['members_only_total'] ) ? (int) $usage['members_only_total'] : 0;
            }

            $current_usage = ! empty( $rule['login_required'] ) ? $group_members_only_total : $group_total;
            if ( $current_usage >= $total_limit ) {
                return false;
            }
        }

        // Per-customer limit kontrolü
        $per_customer_limit = (int) ( $rule['per_customer_limit'] ?? 0 );
        if ( $per_customer_limit > 0 ) {
            $group_user_usage = 0;
            $group_email_usage = 0;
            foreach ( (array) $group_rule_ids as $gid ) {
                $usage = $all_rules_usage[ $gid ] ?? [ 'total' => 0, 'members_only_total' => 0, 'users' => [] ];
                if ( $current_user_id > 0 ) {
                    $group_user_usage += isset( $usage['users'][ $current_user_id ] ) ? (int) $usage['users'][ $current_user_id ] : 0;
                }
                if ( ! empty( $current_user_email ) && isset( $email_usage_map[ $gid ] ) ) {
                    $group_email_usage += (int) $email_usage_map[ $gid ];
                }
            }

            $already_used = max( $group_user_usage, $group_email_usage );
            if ( $already_used >= $per_customer_limit ) {
                return false;
            }
            // Not: Email ve ID hiç yoksa, kontrol checkout aşamasında kesinleşecek.
        }

        return true;
    }

    /**
     * Bir kurala göre indirim miktarını hesaplar.
     */
    private static function calculate_discount_amount( $rule, $base_amount ) {
        $requested_value = isset( $rule['discount_value'] ) ? floatval( $rule['discount_value'] ) : 0.0;
        $discount_type   = $rule['discount_type'] ?? 'amount';
        $campaign_type   = $rule['campaign_type'] ?? '';

        if ( ! is_finite( $requested_value ) || $requested_value < 0 ) {
            $requested_value = 0.0;
        }

        if ( $discount_type === 'percentage' ) {
            $value = ($campaign_type === 'nth_percent_off') ? min( $requested_value, 99.999 ) : $requested_value;
            $amount = ( $base_amount * $value ) / 100.0;
        } else {
            $amount = $requested_value;
        }

        return max(0.0, $amount);
    }

    /**
     * Ürün sayfası bilgilendirmesi için en uygun kuralı döndürür.
     */
    public static function get_first_rule_for_product( $product_id ) {
        if ( ! KNSDD_Data::is_globally_enabled() ) {
            return null;
        }

        $product = wc_get_product( $product_id );
        if ( ! $product ) { return null; }

        $product_cats = wc_get_product_term_ids( $product_id, 'product_cat' );
        
        // Optimize edilmiş grup ve kullanıcı verilerini al
        $groups_data = class_exists('KNSDD_Performance_Optimizer') 
            ? KNSDD_Performance_Optimizer::get_groups_and_dates()
            : ['groups' => KNSDD_Data::get_groups(), 'dates' => KNSDD_Data::get_all_group_dates()];
        $all_groups = $groups_data['groups'];
        $all_group_dates = $groups_data['dates'];
        
        $identity = class_exists('KNSDD_Performance_Optimizer') 
            ? KNSDD_Performance_Optimizer::get_user_identity()
            : ['user_id' => get_current_user_id(), 'email' => ''];
        $current_user_id = $identity['user_id'];
        $current_user_email = $identity['email'];

        // 1. Aday Kuralları Seç
        $candidate_rules = [];
        foreach ( $all_groups as $group ) {
            if ( KNSDD_Data::is_group_paused( $group ) ) { continue; }
            $dates = $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 ( empty( $rule['rule_id'] ) ) { continue; }
                $rule['group'] = $group;
                $candidate_rules[] = $rule;
            }
        }

        if (empty($candidate_rules)) return null;

        // 2. Kullanım verilerini toplu çek
        $candidate_rule_ids = wp_list_pluck( $candidate_rules, 'rule_id' );
        $all_rules_usage = KNSDD_Data::get_usage_for_multiple_rules( $candidate_rule_ids );

        $email_usage_map = [];
        if ( ! empty( $current_user_email ) ) {
            $email_usage_map = KNSDD_Data::get_usage_for_multiple_rules_by_email( $candidate_rule_ids, $current_user_email );
        }

        // 3. Nihai Filtreleme
        $product_matches = [];
        $category_matches = [];
        foreach($candidate_rules as $rule) {
            $conditions_met = self::is_rule_conditions_met( $rule, $current_user_id, $all_rules_usage, $current_user_email, $email_usage_map );
            
            if ( ! $conditions_met ) { continue; }

            $rule_cats = isset($rule['category']) ? (array) $rule['category'] : [];
            $rule_products = ! empty( $rule['product'] ) && is_array( $rule['product'] ) ? $rule['product'] : [];
            
            // BOGO kuralları için trigger ve target kontrolü
            $is_bogo = ( isset($rule['rule_type']) && $rule['rule_type'] === 'special_campaign' && isset($rule['campaign_type']) && $rule['campaign_type'] === 'buy_x_get_y_discount' );
            if ( $is_bogo ) {
                $trigger_products = isset($rule['trigger_products']) && is_array($rule['trigger_products']) ? $rule['trigger_products'] : [];
                $trigger_category = isset($rule['trigger_category']) ? absint($rule['trigger_category']) : 0;
                $target_products = isset($rule['target_products']) && is_array($rule['target_products']) ? $rule['target_products'] : [];
                $target_category = isset($rule['target_category']) ? absint($rule['target_category']) : 0;
                
                // Trigger kontrolü: Ürün öncelikli mantık
                $in_trigger = false;
                $in_trigger_by_product = false;
                $in_trigger_by_category = false;
                
                // Ürün kontrolü
                if ( ! empty( $trigger_products ) && in_array( $product_id, $trigger_products, true ) ) {
                    $in_trigger = true;
                    $in_trigger_by_product = true;
                }
                
                // Kategori kontrolü: SADECE ürün listesi boşsa VEYA ürün eşleşmediyse
                if ( ! $in_trigger_by_product && $trigger_category && ! 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 ( in_array( $trigger_category, $expanded_product_cats, true ) ) {
                        // Kategori eşleşti AMA ürün listesi varsa ve ürün orada değilse, eşleşme YOK
                        if ( empty( $trigger_products ) ) {
                            $in_trigger = true;
                            $in_trigger_by_category = true;
                        }
                    }
                }
                
                // Target kontrolü: Ürün öncelikli mantık
                $in_target = false;
                $in_target_by_product = false;
                $in_target_by_category = false;
                
                // Ürün kontrolü
                if ( ! empty( $target_products ) && in_array( $product_id, $target_products, true ) ) {
                    $in_target = true;
                    $in_target_by_product = true;
                }
                
                // Kategori kontrolü: SADECE ürün listesi boşsa VEYA ürün eşleşmediyse
                if ( ! $in_target_by_product && $target_category && ! 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 ( in_array( $target_category, $expanded_product_cats, true ) ) {
                        // Kategori eşleşti AMA ürün listesi varsa ve ürün orada değilse, eşleşme YOK
                        if ( empty( $target_products ) ) {
                            $in_target = true;
                            $in_target_by_category = true;
                        }
                    }
                }
                
                if ( $in_trigger || $in_target ) {
                    // BOGO için ürünün rolünü kurala ekle (mesaj seçimi için)
                    $rule['_bogo_role'] = [
                        'is_trigger' => $in_trigger,
                        'is_target' => $in_target
                    ];
                    $product_matches[] = $rule;
                }
                continue;
            }
            
            // Varyasyonlar için ebeveyn kategorilerini devral (ürün kategorileri boşsa)
            $cats_for_match = $product_cats;
            if ( empty( $cats_for_match ) ) {
                $par = (int) wp_get_post_parent_id( $product_id );
                if ( $par > 0 ) {
                    $cats_for_match = wc_get_product_term_ids( $par, 'product_cat' );
                }
            }

            // AND semantiği: Hem product hem category set ise ikisi birden sağlanmalı
            if ( ! empty( $rule_products ) && ! empty( $rule_cats ) ) {
                if ( in_array( $product_id, $rule_products, true ) && ! empty( array_intersect( $cats_for_match, $rule_cats ) ) ) {
                    $product_matches[] = $rule; // Ürün-odaklı sayılır
                }
                continue;
            }
            if ( ! empty( $rule_products ) ) {
                if ( in_array( $product_id, $rule_products, true ) ) {
                    $product_matches[] = $rule;
                }
                continue;
            }
            if ( ! empty( $rule_cats ) ) {
                if ( ! empty( array_intersect( $cats_for_match, $rule_cats ) ) ) {
                    $category_matches[] = $rule;
                }
            }
        }

        // 4. En uygun olanı seç
        $pick_best = function( $arr ) {
            if ( empty( $arr ) ) { return null; }
            usort( $arr, function( $a, $b ) {
                $prio_a = isset( $a['priority'] ) ? (int) $a['priority'] : 10;
                $prio_b = isset( $b['priority'] ) ? (int) $b['priority'] : 10;
                if ( $prio_a !== $prio_b ) {
                    return ( $prio_a < $prio_b ) ? 1 : -1;
                }
                $val_a = isset( $a['discount_value'] ) ? (float) $a['discount_value'] : -INF;
                $val_b = isset( $b['discount_value'] ) ? (float) $b['discount_value'] : -INF;
                if ( $val_a == $val_b ) return 0;
                return ( $val_a < $val_b ) ? 1 : -1;
            } );
            return $arr[0];
        };

        $best = $pick_best( $product_matches );
        if ( $best ) { 
            return $best; 
        }
        
        $category_best = $pick_best( $category_matches );
        return $category_best;
    }
}