/**
 * KNSDD Kural Yönetimi - BOGO Kampanya Modülü
 *
 * Bu dosya, "A Al, B'ye İndirim" kampanyasının modal yönetimini içerir.
 * Ana modals.js dosyasından ayrılmıştır (performans ve bakım kolaylığı için).
 */
window.KNSDDModals = window.KNSDDModals || {};

KNSDDModals.BOGO = (function ($) {
    'use strict';

    // Tabler ikon isimleri (mesaj ikonları için)
    const TABLER_ICON_NAMES = [
        'discount-2', 'tag', 'gift', 'percentage', 'shopping-cart',
        'bolt', 'star', 'flame', 'sparkles', 'confetti',
        'heart', 'check'
    ];

    // Ürün kategorileri cache (events.js'den paylaşılan)
    const productCatCache = {};

    /**
     * Ürün kategorilerini al ve cache'le
     */
    const ensureProductCats = (productIds, cb) => {
        try {
            const missing = Array.from(new Set((productIds || []).filter(id => !(id in productCatCache))));
            if (missing.length === 0) { if (typeof cb === 'function') cb(); return; }

            $.ajax({
                url: knsdd_data.ajax_url,
                type: 'POST',
                data: {
                    action: 'knsdd_get_product_categories',
                    nonce: knsdd_data.nonce,
                    product_ids: missing
                },
                success: function (resp) {
                    if (resp && resp.success && resp.data && resp.data.map) {
                        const map = resp.data.map;
                        Object.keys(map).forEach(k => {
                            const pid = parseInt(k, 10);
                            productCatCache[pid] = (map[k] || []).map(x => parseInt(x, 10));
                        });
                    }
                    if (typeof cb === 'function') cb();
                },
                error: function () {
                    if (typeof cb === 'function') cb();
                }
            });
        } catch (_e) { if (typeof cb === 'function') cb(); }
    };

    /**
     * Ortak kategori hesapla (tek kategori varsa döndür)
     */
    const computeCommonCategoryIfUnique = (productIds) => {
        if (!Array.isArray(productIds) || productIds.length === 0) return null;
        if (productIds.length === 1) {
            const cats = productCatCache[productIds[0]] || [];
            if (cats.length === 0) return null;
            return cats[0]; // İlk kategori (doğrudan atanan)
        }
        // Çoklu ürün: kategorilerin kesişimi tekse döndür
        let set = new Set(productCatCache[productIds[0]] || []);
        for (let i = 1; i < productIds.length; i++) {
            const next = new Set(productCatCache[productIds[i]] || []);
            set = new Set([...set].filter(x => next.has(x)));
            if (set.size === 0) break;
        }
        return (set.size === 1) ? Array.from(set)[0] : null;
    };

    /**
     * BOGO için otomatik kategori atama/temizleme
     * @param {string} scope - 'trigger' veya 'target'
     */
    const autoFillBogoCategory = (scope) => {
        const $productSelect = $('#knsdd-' + scope + '-products');
        const $categorySelect = $('#knsdd-' + scope + '-category');

        const pids = ($productSelect.val() || []).map(id => parseInt(id, 10)).filter(id => !isNaN(id) && id > 0);

        // Ürün yoksa kategoriyi temizle
        if (pids.length === 0) {
            if ($categorySelect.val()) {
                $categorySelect.val(null).trigger('change');
            }
            return;
        }

        // Kategori zaten seçiliyse dokunma
        const currentCat = $categorySelect.val();
        if (currentCat) return;

        // Ürün varsa ve kategori boşsa otomatik doldur
        ensureProductCats(pids, () => {
            const uniqueCat = computeCommonCategoryIfUnique(pids);
            if (uniqueCat) {
                $categorySelect.val(String(uniqueCat)).trigger('change');
            }
        });
    };

    /**
     * BOGO kampanya formunu render eder
     * @param {Object} ruleData - Kural verisi
     */
    function renderBuyXGetYDiscountForm(ruleData) {
        const $settingsDiv = $('#knsdd-campaign-settings');
        const categoryOptions = $('#knsdd-category-options-template').html() || '';
        const discountType = ruleData.discount_type || 'percentage';

        // Sekme sistemi ile form oluştur (eski yapı)
        $settingsDiv.html(`
            <div class="knsdd-campaign-tabs">
                <button type="button" class="knsdd-campaign-tab active" data-tab="trigger">
                    <span class="knsdd-campaign-tab-number">1</span>
                    ${knsdd_data.i18n.trigger_label || 'Tetikleyici'}
                </button>
                <button type="button" class="knsdd-campaign-tab" data-tab="target">
                    <span class="knsdd-campaign-tab-number">2</span>
                    ${knsdd_data.i18n.target_label || 'Hedef'}
                </button>
                <button type="button" class="knsdd-campaign-tab" data-tab="discount">
                    <span class="knsdd-campaign-tab-number">3</span>
                    ${knsdd_data.i18n.discount_label || 'İndirim'}
                </button>
            </div>
            
            <!-- Sekme 1: Tetikleyici -->
            <div class="knsdd-campaign-tab-content active" id="knsdd-tab-trigger">
                <div class="knsdd-form-field">
                    <label>
                        ${knsdd_data.i18n.trigger_scope_label || 'Tetikleyici Kapsam'}
                        <span class="knsdd-info-tooltip" title="${knsdd_data.i18n.trigger_scope_hint || 'Sadece kategori: Kategorideki tüm ürünler | Sadece ürün: Seçili ürünler | İkisi birden: Kategorideki sadece seçili ürünler'}">
                            <svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><circle cx="12" cy="12" r="10"></circle><line x1="12" y1="16" x2="12" y2="12"></line><line x1="12" y1="8" x2="12.01" y2="8"></line></svg>
                        </span>
                    </label>
                    <p class="description">${knsdd_data.i18n.trigger_scope_desc || 'Kategori ve/veya ürün seçerek kampanya kapsamını belirleyin. En az birini seçmelisiniz.'}</p>
                </div>
                
                <div id="knsdd-trigger-category-field" class="knsdd-form-field">
                    <label>${knsdd_data.i18n.trigger_category_optional || 'Kategori (Opsiyonel)'}</label>
                    <div class="knsdd-category-select-wrapper">
                        <select id="knsdd-trigger-category" class="knsdd-category-select">
                            ${categoryOptions}
                        </select>
                    </div>
                </div>
                
                <div id="knsdd-trigger-product-field" class="knsdd-form-field">
                    <label>${knsdd_data.i18n.trigger_products_optional || 'Ürünler (Opsiyonel)'}</label>
                    <select id="knsdd-trigger-products" class="knsdd-product-select" multiple></select>
                </div>
                
                <div class="knsdd-form-field">
                    <label>
                        ${knsdd_data.i18n.trigger_quantity_label || 'Tetikleyici Miktar'}
                        <span class="knsdd-info-tooltip" data-tooltip-type="trigger">
                            <svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><circle cx="12" cy="12" r="10"></circle><line x1="12" y1="16" x2="12" y2="12"></line><line x1="12" y1="8" x2="12.01" y2="8"></line></svg>
                        </span>
                    </label>
                    <input type="number" id="knsdd-trigger-quantity" min="1" value="${ruleData.trigger_quantity || 2}">
                    <p class="description">${knsdd_data.i18n.trigger_quantity_desc || 'Sepetten toplam kaç adet gerekli?'}</p>
                </div>
            </div>
            
            <!-- Sekme 2: Hedef -->
            <div class="knsdd-campaign-tab-content" id="knsdd-tab-target">
                <div class="knsdd-form-field">
                    <label>
                        ${knsdd_data.i18n.target_scope_label || 'Hedef Kapsam'}
                        <span class="knsdd-info-tooltip" title="${knsdd_data.i18n.target_scope_hint || 'Sadece kategori: Kategorideki tüm ürünler | Sadece ürün: Seçili ürünler | İkisi birden: Kategorideki sadece seçili ürünler'}">
                            <svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><circle cx="12" cy="12" r="10"></circle><line x1="12" y1="16" x2="12" y2="12"></line><line x1="12" y1="8" x2="12.01" y2="8"></line></svg>
                        </span>
                    </label>
                    <p class="description">${knsdd_data.i18n.target_scope_desc || 'Kategori ve/veya ürün seçerek indirim hedefini belirleyin. En az birini seçmelisiniz.'}</p>
                </div>
                
                <div id="knsdd-target-category-field" class="knsdd-form-field">
                    <label>${knsdd_data.i18n.target_category_optional || 'Kategori (Opsiyonel)'}</label>
                    <div class="knsdd-category-select-wrapper">
                        <select id="knsdd-target-category" class="knsdd-category-select">
                            ${categoryOptions}
                        </select>
                    </div>
                </div>
                
                <div id="knsdd-target-product-field" class="knsdd-form-field">
                    <label>${knsdd_data.i18n.target_products_optional || 'Ürünler (Opsiyonel)'}</label>
                    <select id="knsdd-target-products" class="knsdd-product-select" multiple></select>
                </div>
                
                <div class="knsdd-form-field">
                    <label>
                        ${knsdd_data.i18n.target_quantity_label || 'Hedef Miktar'}
                        <span class="knsdd-info-tooltip" data-tooltip-type="target">
                            <svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><circle cx="12" cy="12" r="10"></circle><line x1="12" y1="16" x2="12" y2="12"></line><line x1="12" y1="8" x2="12.01" y2="8"></line></svg>
                        </span>
                    </label>
                    <input type="number" id="knsdd-target-quantity" min="1" value="${ruleData.target_quantity || 1}">
                    <p class="description">${knsdd_data.i18n.target_quantity_desc || 'Kaç adete indirim uygulanacak?'}</p>
                </div>
            </div>
            
            <!-- Sekme 3: İndirim -->
            <div class="knsdd-campaign-tab-content" id="knsdd-tab-discount">
                <div class="knsdd-form-field">
                    <label>${knsdd_data.i18n.discount_type_label || 'İndirim Türü'}</label>
                    <select id="knsdd-discount-type">
                        <option value="percentage" ${discountType === 'percentage' ? 'selected' : ''}>${knsdd_data.i18n.percentage || 'Yüzde'}</option>
                        <option value="amount" ${discountType === 'amount' ? 'selected' : ''}>${knsdd_data.i18n.amount || 'Sabit Tutar'}</option>
                        <option value="free" ${discountType === 'free' ? 'selected' : ''}>${knsdd_data.i18n.free || 'Bedava'}</option>
                    </select>
                </div>
                
                <div id="knsdd-discount-value-field" class="knsdd-form-field" style="display:${discountType === 'free' ? 'none' : 'block'};">
                    <label>${knsdd_data.i18n.discount_value_label || 'İndirim Değeri'}</label>
                    <input type="number" id="knsdd-discount-value" min="0" step="0.01" value="${ruleData.discount_value || ''}">
                </div>
            </div>
        `);

        // Select2 başlat
        initBuyXGetYSelect2(ruleData);

        // Sekme geçişleri
        $('.knsdd-campaign-tab').off('click').on('click', function () {
            const tabId = $(this).data('tab');
            $('.knsdd-campaign-tab').removeClass('active');
            $(this).addClass('active');
            $('.knsdd-campaign-tab-content').removeClass('active');
            $('#knsdd-tab-' + tabId).addClass('active');
        });

        // İndirim türü değiştiğinde değer alanını göster/gizle
        $('#knsdd-discount-type').on('change', function () {
            const type = $(this).val();
            if (type === 'free') {
                $('#knsdd-discount-value-field').hide();
            } else {
                $('#knsdd-discount-value-field').show();
            }
        });

        // Tooltip dinamik metin güncelleme fonksiyonu
        const updateTooltips = () => {
            // Trigger değerleri
            const triggerQty = $('#knsdd-trigger-quantity').val() || '?';
            const triggerProducts = $('#knsdd-trigger-products').select2('data') || [];
            const triggerCategory = $('#knsdd-trigger-category').select2('data');
            const hasTriggerProducts = triggerProducts.length > 0;
            const hasTriggerCategory = triggerCategory && triggerCategory[0] && triggerCategory[0].id;
            const i18n = (knsdd_data && knsdd_data.i18n) ? knsdd_data.i18n : {};
            const catNameTrig = hasTriggerCategory ? String(triggerCategory[0].text) : '';
            const replaceTokens = (tpl, opts = {}) => {
                const t = String(tpl || '');
                const TR = String(opts.triggerQty ?? triggerQty);
                const TG = String(opts.targetQty ?? '');
                const CAT = String(opts.categoryName ?? '');
                return t.replace(/%TRIGGER%/g, TR).replace(/%TARGET%/g, TG).replace(/%CATEGORY%/g, CAT);
            };

            // Target değerleri
            const targetQty = $('#knsdd-target-quantity').val() || '?';
            const targetProducts = $('#knsdd-target-products').select2('data') || [];
            const targetCategory = $('#knsdd-target-category').select2('data');
            const hasTargetProducts = targetProducts.length > 0;
            const hasTargetCategory = targetCategory && targetCategory[0] && targetCategory[0].id;
            const catNameTarg = hasTargetCategory ? String(targetCategory[0].text) : '';

            // Trigger tooltip metni
            const $triggerTooltip = $('.knsdd-info-tooltip[data-tooltip-type="trigger"]');
            let triggerTpl;
            if (hasTriggerProducts && hasTriggerCategory) {
                triggerTpl = i18n.trigger_tooltip_both || 'Sepette %CATEGORY% kategorisindeki seçtiğiniz tetikleyici ürünlerden toplam %TRIGGER% adet bulunmalıdır. (Kategori + ürün birlikte değerlendirilir.) Örnek: Bu listedeki ürünlerin her %TRIGGER% adedinde hedef indirimi tetiklenir.';
            } else if (hasTriggerProducts) {
                triggerTpl = i18n.trigger_tooltip_products_only || 'Sepette seçtiğiniz tetikleyici ürünlerden toplam %TRIGGER% adet bulunmalıdır. Örnek: Bu ürünlerden her %TRIGGER% adetlik alışta hedef indirimi tetiklenir.';
            } else if (hasTriggerCategory) {
                triggerTpl = i18n.trigger_tooltip_category_only || 'Sepette %CATEGORY% kategorisine ait ürünlerden toplam %TRIGGER% adet bulunmalıdır. Örnek: Bu kategoriden her %TRIGGER% adetlik alışta hedef indirimi tetiklenir.';
            } else {
                triggerTpl = i18n.trigger_tooltip_default || 'Tetikleyici kapsamı seçiniz: Kategori ve/veya ürün. En az biri gereklidir.';
            }
            const triggerText = replaceTokens(triggerTpl, { triggerQty, categoryName: catNameTrig });
            $triggerTooltip.attr('title', triggerText).attr('aria-label', triggerText);

            // Target tooltip metni
            const $targetTooltip = $('.knsdd-info-tooltip[data-tooltip-type="target"]');
            let targetTpl;
            if (hasTargetProducts && hasTargetCategory) {
                targetTpl = i18n.target_tooltip_both || 'Her tetikleme seti için %CATEGORY% kategorisindeki seçili hedef ürünlerden %TARGET% adete indirim uygulanır. (Kategori + ürün birlikte değerlendirilir.) Örnek: Tetikleyici %TRIGGER%, hedef %TARGET% ise → Her %TRIGGER% tetiklemede bu listedeki ürünlerden %TARGET% adete indirim yapılır.';
            } else if (hasTargetProducts) {
                targetTpl = i18n.target_tooltip_products_only || 'Her tetikleme seti için seçtiğiniz hedef ürünlerden %TARGET% adete indirim uygulanır. Örnek: Tetikleyici %TRIGGER%, hedef %TARGET% ise → Her %TRIGGER% tetiklemede hedef ürünlerden %TARGET% adet indirimli olur.';
            } else if (hasTargetCategory) {
                targetTpl = i18n.target_tooltip_category_only || 'Her tetikleme seti için %CATEGORY% kategorisindeki ürünlerden %TARGET% adete indirim uygulanır. Örnek: Tetikleyici %TRIGGER%, hedef %TARGET% ise → Her %TRIGGER% tetiklemede bu kategoriden %TARGET% adete indirim yapılır.';
            } else {
                targetTpl = i18n.target_tooltip_default || 'Hedef kapsamı seçiniz: Kategori ve/veya ürün. En az biri gereklidir.';
            }
            const targetText = replaceTokens(targetTpl, { triggerQty, targetQty, categoryName: catNameTarg });
            $targetTooltip.attr('title', targetText).attr('aria-label', targetText);
        };

        // İlk yükleme için tooltip'leri ayarla
        updateTooltips();

        // Ürün/Kategori seçimi değiştiğinde tooltip'i güncelle
        $('#knsdd-trigger-products, #knsdd-trigger-category').on('change', updateTooltips);
        $('#knsdd-target-products, #knsdd-target-category').on('change', updateTooltips);

        // Miktar değiştiğinde tooltip'i güncelle
        $('#knsdd-trigger-quantity, #knsdd-target-quantity').on('input change', updateTooltips);
    }

    /**
     * BOGO Select2 başlatma ve event handler'ları
     * @param {Object} ruleData - Kural verisi
     */
    function initBuyXGetYSelect2(ruleData) {
        // Select2 dil kodu: PHP'den geliyor, yoksa İngilizce varsayılan
        const s2lang = knsdd_data.select2_lang || 'en';

        // Kategori Select2 (statik)
        $('#knsdd-trigger-category, #knsdd-target-category').select2({
            language: s2lang,
            placeholder: '',
            dropdownParent: $('#knsdd-campaign-modal'),
            allowClear: true,
            width: 'resolve'
        });

        // Mevcut değerleri set et
        if (ruleData.trigger_category) {
            $('#knsdd-trigger-category').val(ruleData.trigger_category).trigger('change');
        }
        if (ruleData.target_category) {
            $('#knsdd-target-category').val(ruleData.target_category).trigger('change');
        }

        // Dropdown adapter'ı al
        const DropdownAdapter = (typeof KNSDDSelect2 !== 'undefined' && KNSDDSelect2.getS2DropdownAdapter)
            ? KNSDDSelect2.getS2DropdownAdapter()
            : null;

        // Ürün Select2 (AJAX) - Trigger
        const triggerOptions = {
            language: s2lang,
            placeholder: '',
            closeOnSelect: false,
            minimumInputLength: 2,
            multiple: true,
            width: '100%',
            dropdownParent: $('#knsdd-campaign-modal'),
            escapeMarkup: m => m,
            templateResult: KNSDDSelect2.formatProductOption,
            templateSelection: KNSDDSelect2.formatProductSelection,
            ajax: {
                url: ajaxurl,
                dataType: 'json',
                delay: 250,
                data: function (params) {
                    return {
                        action: 'knsdd_search_products',
                        nonce: knsdd_data.nonce,
                        q: params.term,
                        category: $('#knsdd-trigger-category').val()
                    };
                },
                processResults: KNSDDSelect2.processProductResults,
                cache: false
            },
        };

        // Dropdown adapter varsa ekle
        if (DropdownAdapter) {
            triggerOptions.dropdownAdapter = DropdownAdapter;
        }

        $('#knsdd-trigger-products').select2(triggerOptions);

        // Ürün Select2 (AJAX) - Target
        const targetOptions = {
            language: s2lang,
            placeholder: '',
            closeOnSelect: false,
            minimumInputLength: 2,
            multiple: true,
            width: '100%',
            dropdownParent: $('#knsdd-campaign-modal'),
            escapeMarkup: m => m,
            templateResult: KNSDDSelect2.formatProductOption,
            templateSelection: KNSDDSelect2.formatProductSelection,
            ajax: {
                url: ajaxurl,
                dataType: 'json',
                delay: 250,
                data: function (params) {
                    return {
                        action: 'knsdd_search_products',
                        nonce: knsdd_data.nonce,
                        q: params.term,
                        category: $('#knsdd-target-category').val()
                    };
                },
                processResults: KNSDDSelect2.processProductResults,
                cache: false
            }
        };

        // Dropdown adapter varsa ekle
        if (DropdownAdapter) {
            targetOptions.dropdownAdapter = DropdownAdapter;
        }

        $('#knsdd-target-products').select2(targetOptions);

        // Arama kutusu odak yönetimi
        $('#knsdd-trigger-products, #knsdd-target-products').on('select2:select', function () {
            $(this).select2('open');
            $('.select2-container--open .select2-search__field').val('').trigger('focus');
            KNSDDSelect2.applyS2RemoveLabels($(this));
        }).on('select2:open', () => {
            $('.select2-container--open .select2-search__field').trigger('focus');
        }).on('select2:unselect change', function () {
            KNSDDSelect2.applyS2RemoveLabels($(this));
        });

        // Otomatik kategori atama/temizleme - Tetikleyici
        $('#knsdd-trigger-products').on('select2:select select2:unselect', function () {
            try {
                const cfg = (window.knsdd_data && knsdd_data.settings) ? knsdd_data.settings : {};
                if (cfg.auto_fill_category_from_products) {
                    autoFillBogoCategory('trigger');
                }
            } catch (_e) { }
        });

        // Otomatik kategori atama/temizleme - Hedef
        $('#knsdd-target-products').on('select2:select select2:unselect', function () {
            try {
                const cfg = (window.knsdd_data && knsdd_data.settings) ? knsdd_data.settings : {};
                if (cfg.auto_fill_category_from_products) {
                    autoFillBogoCategory('target');
                }
            } catch (_e) { }
        });

        // İlk yükleme için tooltip'leri uygula
        KNSDDSelect2.applyS2RemoveLabels($('#knsdd-trigger-products'));
        KNSDDSelect2.applyS2RemoveLabels($('#knsdd-target-products'));

        // Çakışan ürünleri temizle
        setupOverlapPruning();

        // Kategori değişimi → Ürün uyarısı
        setupCategoryChangeHandlers();

        // Mevcut ürünleri yükle
        loadExistingProducts(ruleData);
    }

    /**
     * Çakışan ürünleri otomatik temizle (hedeften)
     */
    function setupOverlapPruning() {
        const getIds = ($sel) => (($sel.val() || []).map(String));
        const setIds = ($sel, ids) => { $sel.val(ids.map(String)).trigger('change'); };

        let campaignInfoTimer;
        const showEphemeralInfo = (msg) => {
            const $info = $('#knsdd-campaign-info-message');
            if (!$info.length) return;
            $info.html(`<div class="knsdd-notice knsdd-notice-info"><p>${msg}</p></div>`).show();
            if (campaignInfoTimer) { clearTimeout(campaignInfoTimer); }
            const ms = 3000;
            campaignInfoTimer = setTimeout(function () { $info.fadeOut(150, function () { $info.empty(); }); }, ms);
        };

        const pruneOverlap = () => {
            const $trig = $('#knsdd-trigger-products');
            const $targ = $('#knsdd-target-products');
            const trig = getIds($trig);
            const targ = getIds($targ);
            if (!trig.length || !targ.length) return;
            const setTrig = new Set(trig);
            const nextTarg = targ.filter(id => !setTrig.has(id));
            const removedCount = targ.length - nextTarg.length;
            if (removedCount > 0) {
                setIds($targ, nextTarg);
                const msg = (knsdd_data && knsdd_data.i18n && knsdd_data.i18n.bogo_pruned_overlap_from_target)
                    ? String(knsdd_data.i18n.bogo_pruned_overlap_from_target).replace('%d', removedCount)
                    : `${removedCount} ürün tetikleyici ile çakıştığı için hedeften çıkarıldı.`;
                showEphemeralInfo(msg);
                // Validasyonu tetikle
                const $validationMessage = $('#knsdd-campaign-validation-message');
                const $saveButton = $('#knsdd-save-campaign');
                if (typeof KNSDDModals.BOGO !== 'undefined' && KNSDDModals.BOGO.validate) {
                    KNSDDModals.BOGO.validate($validationMessage, $saveButton);
                }
            }
        };

        $('#knsdd-trigger-products, #knsdd-target-products').on('change', pruneOverlap);
        pruneOverlap();
    }

    /**
     * Kategori değişimi event handler'ları
     */
    function setupCategoryChangeHandlers() {
        // Rose notification helper
        const showCategoryPruneNotification = (message) => {
            const $info = $('#knsdd-campaign-info-message');
            if (!$info.length) return;
            $info.hide().html('<div class="knsdd-notice knsdd-notice-rose"><p>' + message + '</p></div>').fadeIn(300);
            setTimeout(function () {
                $info.fadeOut(400, function () { $info.empty(); });
            }, 6000);
        };

        $('#knsdd-trigger-category').on('change', function () {
            const newCategoryId = $(this).val();
            const selectedProducts = $('#knsdd-trigger-products').val() || [];

            if (selectedProducts.length > 0 && newCategoryId) {
                // Ürün kategorilerini cache'den al veya backend'den çek
                ensureProductCats(selectedProducts.map(id => parseInt(id, 10)), () => {
                    const catId = parseInt(newCategoryId, 10);
                    const validProducts = selectedProducts.filter(pid => {
                        const cats = productCatCache[parseInt(pid, 10)] || [];
                        return cats.includes(catId); // Hiyerarşik: Alt + üst kategoriler
                    });

                    const removedCount = selectedProducts.length - validProducts.length;
                    if (removedCount > 0) {
                        $('#knsdd-trigger-products').val(validProducts).trigger('change');
                        const msg = (knsdd_data.i18n && knsdd_data.i18n.products_pruned_due_category)
                            ? String(knsdd_data.i18n.products_pruned_due_category).replace('%d', removedCount)
                            : (removedCount + ' ürün seçili kategoride olmadığı için kaldırıldı.');
                        showCategoryPruneNotification(msg);
                    }
                });
            }
        });

        $('#knsdd-target-category').on('change', function () {
            const newCategoryId = $(this).val();
            const selectedProducts = $('#knsdd-target-products').val() || [];

            if (selectedProducts.length > 0 && newCategoryId) {
                // Ürün kategorilerini cache'den al veya backend'den çek
                ensureProductCats(selectedProducts.map(id => parseInt(id, 10)), () => {
                    const catId = parseInt(newCategoryId, 10);
                    const validProducts = selectedProducts.filter(pid => {
                        const cats = productCatCache[parseInt(pid, 10)] || [];
                        return cats.includes(catId); // Hiyerarşik: Alt + üst kategoriler
                    });

                    const removedCount = selectedProducts.length - validProducts.length;
                    if (removedCount > 0) {
                        $('#knsdd-target-products').val(validProducts).trigger('change');
                        const msg = (knsdd_data.i18n && knsdd_data.i18n.products_pruned_due_category)
                            ? String(knsdd_data.i18n.products_pruned_due_category).replace('%d', removedCount)
                            : (removedCount + ' ürün seçili kategoride olmadığı için kaldırıldı.');
                        showCategoryPruneNotification(msg);
                    }
                });
            }
        });
    }

    /**
     * Mevcut ürünleri yükle
     * @param {Object} ruleData - Kural verisi
     */
    function loadExistingProducts(ruleData) {
        if (ruleData.trigger_products && ruleData.trigger_products.length > 0) {
            $.ajax({
                url: ajaxurl,
                data: {
                    action: 'knsdd_get_products_by_ids',
                    nonce: knsdd_data.nonce,
                    ids: ruleData.trigger_products
                },
                success: function (data) {
                    if (data.success && data.data.results) {
                        data.data.results.forEach(function (item) {
                            const option = new Option(item.text, item.id, true, true);
                            $('#knsdd-trigger-products').append(option);
                        });
                        $('#knsdd-trigger-products').trigger('change');
                    }
                }
            });
        }

        if (ruleData.target_products && ruleData.target_products.length > 0) {
            $.ajax({
                url: ajaxurl,
                data: {
                    action: 'knsdd_get_products_by_ids',
                    nonce: knsdd_data.nonce,
                    ids: ruleData.target_products
                },
                success: function (data) {
                    if (data.success && data.data.results) {
                        data.data.results.forEach(function (item) {
                            const option = new Option(item.text, item.id, true, true);
                            $('#knsdd-target-products').append(option);
                        });
                        $('#knsdd-target-products').trigger('change');
                    }
                }
            });
        }
    }

    /**
     * BOGO validasyonu
     * @param {jQuery} $validationMessage - Validasyon mesaj alanı
     * @param {jQuery} $saveButton - Kaydet butonu
     * @returns {boolean} - Geçerli mi?
     */
    function validateBogoInputs($validationMessage, $saveButton) {
        // Önce her şeyi temizle ve butonu aktif et
        $validationMessage.empty().hide();
        $saveButton.prop('disabled', false);

        const triggerQty = parseInt($('#knsdd-trigger-quantity').val(), 10);
        const targetQty = parseInt($('#knsdd-target-quantity').val(), 10);
        const discountType = $('#knsdd-discount-type').val();
        const discountValue = parseFloat($('#knsdd-discount-value').val());

        let error = '';

        // Trigger kontrolleri
        const triggerProducts = $('#knsdd-trigger-products').val() || [];
        const triggerCat = parseInt($('#knsdd-trigger-category').val(), 10);
        if (triggerProducts.length === 0 && (!triggerCat || triggerCat <= 0)) {
            error = knsdd_data.i18n.trigger_scope_required || 'Lütfen tetikleyici kategori ve/veya ürün seçin.';
        }

        // Target kontrolleri
        if (!error) {
            const targetProducts = $('#knsdd-target-products').val() || [];
            const targetCat = parseInt($('#knsdd-target-category').val(), 10);
            if (targetProducts.length === 0 && (!targetCat || targetCat <= 0)) {
                error = knsdd_data.i18n.target_scope_required || 'Lütfen hedef kategori ve/veya ürün seçin.';
            }
        }

        // Miktar kontrolleri
        if (!error && (isNaN(triggerQty) || triggerQty < 1)) {
            error = knsdd_data.i18n.invalid_trigger_quantity || 'Tetikleyici miktar en az 1 olmalı.';
        }
        if (!error && (isNaN(targetQty) || targetQty < 1)) {
            error = knsdd_data.i18n.invalid_target_quantity || 'Hedef miktar en az 1 olmalı.';
        }

        // İndirim kontrolleri
        if (!error && discountType !== 'free') {
            if (isNaN(discountValue) || discountValue <= 0) {
                error = knsdd_data.i18n.error_positive_values || 'İndirim değeri 0\'dan büyük olmalı.';
            } else if (discountType === 'percentage' && discountValue > 100) {
                error = knsdd_data.i18n.error_percent_max || 'Yüzde indirimi 100\'den küçük olmalı.';
            }
        }

        // BOGO ÖZEL: Tetikleyici ve hedef ürün setleri birebir aynı OLAMAZ
        const $sameWarn = $('#knsdd-campaign-same-scope-warning');
        const trig = ($('#knsdd-trigger-products').val() || []).map(String).sort();
        const targ = ($('#knsdd-target-products').val() || []).map(String).sort();
        const sameScopeInvalid = (trig.length > 0 && targ.length > 0 && trig.join(',') === targ.join(','));
        if ($sameWarn.length) {
            if (sameScopeInvalid) {
                const msg = (knsdd_data && knsdd_data.i18n && knsdd_data.i18n.bogo_same_products_error)
                    ? knsdd_data.i18n.bogo_same_products_error
                    : 'Tetikleyici ve hedef ürün seçimi birebir aynı olamaz. Lütfen farklı ürün(ler) seçin.';
                $sameWarn.html('<div class="knsdd-notice knsdd-notice-rose"><p>' + msg + '</p></div>').show();
            } else {
                $sameWarn.empty().hide();
            }
        }

        if (error) {
            if (knsdd_data.settings && knsdd_data.settings.warning_location === 'top_notice') {
                if (typeof showNotice === 'function') {
                    showNotice('warning', error);
                }
            } else {
                $validationMessage.html(`<div class="knsdd-notice knsdd-notice-warning"><p>${error}</p></div>`).show();
            }
        }

        // Kaydet butonu: herhangi bir hata veya sameScopeInvalid varsa devre dışı
        if (error || sameScopeInvalid) {
            $saveButton.prop('disabled', true);
            return false;
        }

        return true;
    }

    /**
     * BOGO form verilerini topla
     * @param {Object} ruleData - Mevcut kural verisi
     * @returns {Object} - Güncellenmiş kural verisi
     */
    function collectBogoData(ruleData) {
        // Eski değerleri sakla (değişiklik algılama için)
        const oldData = {
            trigger_products: (ruleData.trigger_products || []).slice().sort(),
            trigger_category: ruleData.trigger_category || null,
            trigger_quantity: ruleData.trigger_quantity || 0,
            target_products: (ruleData.target_products || []).slice().sort(),
            target_category: ruleData.target_category || null,
            target_quantity: ruleData.target_quantity || 0,
            discount_type: ruleData.discount_type || '',
            discount_value: ruleData.discount_value || 0
        };

        // Yeni değerleri al
        const discountType = $('#knsdd-discount-type').val();
        const discountVal = parseFloat($('#knsdd-discount-value').val()) || 0;
        const newData = {
            trigger_products: ($('#knsdd-trigger-products').val() || []).slice().sort(),
            trigger_category: $('#knsdd-trigger-category').val() || null,
            trigger_quantity: parseInt($('#knsdd-trigger-quantity').val(), 10) || 0,
            target_products: ($('#knsdd-target-products').val() || []).slice().sort(),
            target_category: $('#knsdd-target-category').val() || null,
            target_quantity: parseInt($('#knsdd-target-quantity').val(), 10) || 0,
            discount_type: discountType || '',
            discount_value: (discountType === 'free') ? 0 : discountVal
        };

        // Değişiklik var mı kontrol et
        const hasChanges =
            JSON.stringify(oldData.trigger_products) !== JSON.stringify(newData.trigger_products) ||
            oldData.trigger_category !== newData.trigger_category ||
            oldData.trigger_quantity !== newData.trigger_quantity ||
            JSON.stringify(oldData.target_products) !== JSON.stringify(newData.target_products) ||
            oldData.target_category !== newData.target_category ||
            oldData.target_quantity !== newData.target_quantity ||
            oldData.discount_type !== newData.discount_type ||
            oldData.discount_value !== newData.discount_value;

        // Flag ekle (sadece mesaj varsa ve değişiklik varsa uyar)
        if (hasChanges && ruleData.messages &&
            (ruleData.messages.product_trigger || ruleData.messages.product_target)) {
            ruleData._bogo_settings_changed = true;
        }

        // Normal veri toplama
        ruleData.trigger_type = 'product'; // Geriye uyumluluk
        ruleData.trigger_products = newData.trigger_products;
        ruleData.trigger_category = newData.trigger_category;
        ruleData.trigger_quantity = newData.trigger_quantity;
        ruleData.target_type = 'product'; // Geriye uyumluluk
        ruleData.target_products = newData.target_products;
        ruleData.target_category = newData.target_category;
        ruleData.target_quantity = newData.target_quantity;
        ruleData.discount_type = newData.discount_type;
        ruleData.discount_value = newData.discount_value;

        // Kategori isimlerini cache'e ekle
        window.knsddCategoryCache = window.knsddCategoryCache || {};
        if (ruleData.trigger_category) {
            const catText = $('#knsdd-trigger-category option:selected').text();
            if (catText) {
                window.knsddCategoryCache[ruleData.trigger_category] = catText;
            }
        }
        if (ruleData.target_category) {
            const catText = $('#knsdd-target-category option:selected').text();
            if (catText) {
                window.knsddCategoryCache[ruleData.target_category] = catText;
            }
        }

        return ruleData;
    }

    // Public API
    return {
        render: renderBuyXGetYDiscountForm,
        validate: validateBogoInputs,
        collectData: collectBogoData
    };

})(jQuery);
