/**
 * KNSDD Kural Yönetimi - Modal Yönetim Modülü
 *
 * Bu dosya, "Limitler", "Kampanya" ve "Mesajlar" pencerelerinin (modal)
 * açılması, kapanması ve içlerindeki formların yönetimiyle ilgili tüm mantığı içerir.
 */
window.KNSDDRules = window.KNSDDRules || {};

KNSDDRules.modals = (function ($) {
    'use strict';

    let $limitsModal, $campaignModal, $messagesModal;
    // Ephemeral info timer for small modal info messages
    let campaignInfoTimer = null;

    // --- Special campaign field management (UI safety) ---
    const SPECIAL_KEYS = {
        'buy_x_pay_y': ['buy_x', 'pay_y'],
        'nth_percent_off': ['nth', 'percent'],
        'cart_total_discount': ['min_cart_total', 'discount_type', 'discount_value'],
        'buy_x_get_y_discount': ['trigger_type', 'trigger_products', 'trigger_category', 'trigger_quantity', 'target_type', 'target_products', 'target_category', 'target_quantity', 'discount_type', 'discount_value']
    };
    const ALL_SPECIAL_KEYS = ['buy_x', 'pay_y', 'nth', 'percent', 'min_cart_total', 'discount_type', 'discount_value', 'trigger_type', 'trigger_products', 'trigger_category', 'trigger_quantity', 'target_type', 'target_products', 'target_category', 'target_quantity'];

    // Remove all special-campaign keys from a ruleData object
    function clearAllSpecialKeys(obj) {
        if (!obj) return;
        ALL_SPECIAL_KEYS.forEach(function (k) { if (Object.prototype.hasOwnProperty.call(obj, k)) { delete obj[k]; } });
        // Mesajları da temizle (kampanya türü değiştiğinde mesajlar da silinmeli)
        delete obj.messages;
        // Limitleri de temizle (her kampanya kendi limitlerini içerir)
        delete obj.total_limit;
        delete obj.per_customer_limit;
    }

    // Check if previous campaign type has any data entered
    function checkIfPreviousTypeHasData(ruleData, type) {
        const keys = SPECIAL_KEYS[type] || [];
        return keys.some(function (key) {
            const val = ruleData[key];
            if (Array.isArray(val)) return val.length > 0;
            if (typeof val === 'string') return val.trim() !== '';
            if (typeof val === 'number') return val > 0;
            return !!val;
        });
    }

    // Show prominent warning message (longer duration, warning theme)
    function showProminentWarning(message, duration) {
        const $info = $('#knsdd-campaign-info-message');
        if (!$info.length) return;

        $info.html('<div class="knsdd-notice knsdd-notice-warning"><p>' + message + '</p></div>').show();

        if (campaignInfoTimer) { clearTimeout(campaignInfoTimer); }
        const ms = duration || 5000; // 5 saniye varsayılan
        campaignInfoTimer = setTimeout(function () {
            $info.fadeOut(300, function () { $info.empty(); });
        }, ms);
    }

    // Show rose-themed temporary notification (for category pruning)
    function showRoseNotification(message, duration) {
        const $info = $('#knsdd-campaign-info-message');
        if (!$info.length) return;

        // Fade-in: Mesaj yumuşak bir şekilde belirir (opacity 0 → 1)
        $info.hide().html('<div class="knsdd-notice knsdd-notice-rose"><p>' + message + '</p></div>').fadeIn(300);

        if (campaignInfoTimer) { clearTimeout(campaignInfoTimer); }
        const ms = duration || 6000; // 6 saniye varsayılan
        campaignInfoTimer = setTimeout(function () {
            // Fade-out: Mesaj yumuşak bir şekilde kaybolur (opacity 1 → 0)
            $info.fadeOut(400, function () { $info.empty(); });
        }, ms);
    }

    // --- Yardımcılar: İkon görünürlüğü (sadece preset) ---
    function applyIconVisibility(scope) {
        const enabled = (scope === 'product') ? $('#knsdd-icon-enabled-product').is(':checked') : $('#knsdd-icon-enabled-cart').is(':checked');
        const $wrap = (scope === 'product') ? $('#knsdd-icon-enabled-product').closest('.knsdd-icon-settings') : $('#knsdd-icon-enabled-cart').closest('.knsdd-icon-settings');
        // Paket/Seç butonu ve önizleme (tüm paket alanını gizle/göster)
        $wrap.find('.knsdd-icon-package-field').toggle(enabled);
        // Eski kalıntılar (varsa) için inline grupları da kontrol et
        $wrap.find('.knsdd-form-field-inline').toggle(enabled);
        // Renk alanı
        $wrap.find('.knsdd-form-field').has('#knsdd-icon-color-' + scope).toggle(enabled);
        // Yeni dikey alanlar: konum ve boyut
        $wrap.find('.knsdd-form-field').has('#knsdd-icon-position-' + scope).toggle(enabled);
        $wrap.find('.knsdd-form-field').has('#knsdd-icon-size-' + scope).toggle(enabled);
    }

    // --- Iconify + Tabler: 25 sabit ikon adı ---
    const TABLER_ICON_NAMES = [
        'mail', 'bell-heart', 'balloon', 'confetti', 'discount-2', 'gift', 'gift-card',
        'shopping-cart', 'shopping-bag', 'shopping-bag-check', 'shopping-bag-heart',
        'shopping-cart-heart', 'shopping-cart-star', 'basket', 'basket-check', 'package',
        'ticket', 'bell-ringing', 'tag', 'speakerphone', 'star', 'stars', 'rosette-discount-check',
        'heart', 'check'
    ];

    function renderIconPreview($el, tablerName) {
        const icon = (tablerName && TABLER_ICON_NAMES.indexOf(tablerName) !== -1) ? tablerName : TABLER_ICON_NAMES[0];
        $el.html(`<iconify-icon class="knsdd-icon" icon="tabler:${icon}" style="font-size:18px;"></iconify-icon>`);
    }

    // --- BOGO fonksiyonları modal-campaign-bogo.js'ye taşındı ---
    // Fallback fonksiyonları (BOGO modülü yüklenmezse)
    function renderBuyXGetYDiscountForm(ruleData) {
        console.error('BOGO modülü yüklenmedi! Fallback çalışıyor.');
        $('#knsdd-campaign-settings').html('<p style="color:red;">BOGO modülü yüklenemedi. Lütfen sayfayı yenileyin.</p>');
    }

    function initBuyXGetYSelect2(ruleData) {
        console.error('BOGO modülü yüklenmedi! initBuyXGetYSelect2 fallback.');
    }

    // Mesajlar modalı doğrulaması: modül kapsamına taşındı (openMessagesModal ve init paylaşıyor)
    const validateMessagesInputs = () => {
        const $validation = $('#knsdd-messages-validation-message');
        const $saveBtn = $('#knsdd-save-messages');
        if (!$messagesModal || !$messagesModal.is(':visible')) { return true; }

        const text = ($('#knsdd-message-cart').val() || '').trim();
        const showMini = $('#knsdd-show-mini').is(':checked');
        const showCart = $('#knsdd-show-cart').is(':checked');
        const showCheckout = $('#knsdd-show-checkout').is(':checked');

        // En az bir alan seçiliyken metin boş olmamalı
        if ((showMini || showCart || showCheckout) && text.length === 0) {
            const msg = (knsdd_data && knsdd_data.i18n && knsdd_data.i18n.messages_text_required)
                ? knsdd_data.i18n.messages_text_required
                : 'Sepet/Ödeme mesaj alanı boş olamaz. Lütfen bir metin girin veya tüm gösterim tiklerini kaldırın.';
            // Ayar kontrolü: satır içi veya üstte göster
            if (knsdd_data.settings && knsdd_data.settings.warning_location === 'top_notice') {
                showNotice('warning', msg);
            } else {
                $validation.html(`<div class="knsdd-notice knsdd-notice-warning"><p>${msg}</p></div>`).show();
            }
            $saveBtn.prop('disabled', true);
            return false;
        }

        // HEX renk basit doğrulaması (boşsa sorun değil)
        const color = ($('#knsdd-message-color-cart').val() || '').trim();
        if (color && !/^#([0-9a-fA-F]{3}|[0-9a-fA-F]{6})$/.test(color)) {
            const msg = (knsdd_data && knsdd_data.i18n && knsdd_data.i18n.invalid_color_hex)
                ? knsdd_data.i18n.invalid_color_hex
                : 'Geçersiz renk değeri. Lütfen #RGB veya #RRGGBB biçiminde girin.';
            // Ayar kontrolü: satır içi veya üstte göster
            if (knsdd_data.settings && knsdd_data.settings.warning_location === 'top_notice') {
                showNotice('warning', msg);
            } else {
                $validation.html(`<div class="knsdd-notice knsdd-notice-warning"><p>${msg}</p></div>`).show();
            }
            $saveBtn.prop('disabled', true);
            return false;
        }

        // İkon anahtarı doğrulaması (aktifse) – Iconify/Tabler listesine göre (product & cart)
        const checkIconValid = (enabledSel, valueSel) => {
            if (!$(enabledSel).is(':checked')) return true;
            const raw = ($(valueSel).val() || '').trim();
            const key = raw.replace(/^tabler:/, '');
            if (key && TABLER_ICON_NAMES.indexOf(key) === -1) {
                const error = (knsdd_data && knsdd_data.i18n && knsdd_data.i18n.invalid_icon_key)
                    ? knsdd_data.i18n.invalid_icon_key
                    : 'Geçersiz ikon anahtarı. Lütfen listeden bir ikon seçin.';
                // Ayar kontrolü: satır içi veya üstte göster
                if (knsdd_data.settings && knsdd_data.settings.warning_location === 'top_notice') {
                    showNotice('warning', error);
                } else {
                    $validation.html(`<div class="knsdd-notice knsdd-notice-warning"><p>${error}</p></div>`).show();
                }
                $saveBtn.prop('disabled', true);
                return false;
            }
            return true;
        };
        if (!checkIconValid('#knsdd-icon-enabled-product', '#knsdd-icon-value-product')) return false;
        if (!checkIconValid('#knsdd-icon-enabled-cart', '#knsdd-icon-value-cart')) return false;

        $validation.empty().hide();
        $saveBtn.prop('disabled', false);
        return true;
    };

    // Limitler modalı doğrulaması: Toplam >= Müşteri Başına (her ikisi de > 0 ise)
    const validateLimitsInputs = () => {
        const $validation = $('#knsdd-limits-validation-message');
        const $saveBtn = $('#knsdd-save-limits');
        if (!$limitsModal || !$limitsModal.is(':visible')) { return true; }

        const tRaw = ($('#knsdd-total-limit').val() || '').trim();
        const pRaw = ($('#knsdd-per-customer-limit').val() || '').trim();
        const t = parseInt(tRaw, 10);
        const p = parseInt(pRaw, 10);

        let invalid = false;
        if (!isNaN(t) && !isNaN(p) && t > 0 && p > 0 && t < p) {
            invalid = true;
        }

        if (invalid) {
            const msg = (knsdd_data && knsdd_data.i18n && knsdd_data.i18n.invalid_limits_relation)
                ? knsdd_data.i18n.invalid_limits_relation
                : 'Toplam kullanım limiti, müşteri başına kullanım limitinden küçük olamaz.';
            if ($validation.length) {
                $validation.html(`<div class="knsdd-notice knsdd-notice-warning"><p>${msg}</p></div>`).show();
            }
            $saveBtn.prop('disabled', true);
            return false;
        }

        if ($validation.length) { $validation.empty().hide(); }
        $saveBtn.prop('disabled', false);
        return true;
    };

    /**
     * Verilen satırla aynı tier grubundaki tüm satırları bulur (sadece standard_discount için)
     * @param {jQuery} $row - Referans satır
     * @param {jQuery} $tbody - Tablo body elementi
     * @returns {jQuery[]} - Aynı gruptaki tüm satırlar (kendisi dahil)
     */
    const findRelatedTierRows = ($row, $tbody) => {
        const ruleData = $row.data('ruleData') || {};
        const ruleType = ruleData.rule_type || 'standard_discount';

        // Özel kampanyalar için grup yok
        if (ruleType !== 'standard_discount') {
            return [$row];
        }

        // Referans satırın kapsamını al
        const refCategory = $row.find('.knsdd-rule-category').val() || '';
        const refProducts = ($row.find('.knsdd-rule-product').val() || [])
            .map(v => String(v))
            .sort()
            .join(',');

        // Kapsam boşsa (kategori ve ürün yok) → grup yok
        if (!refCategory && !refProducts) {
            return [$row];
        }

        // Tablodaki tüm satırları tara
        const relatedRows = [];

        $tbody.find('tr').each(function () {
            const $currentRow = $(this);

            // Boş satırları atla
            if (typeof KNSDDRules !== 'undefined' && KNSDDRules.validators && KNSDDRules.validators.isRowCompletelyEmpty($currentRow)) {
                return;
            }

            // Sadece miktar indirimi satırlarını kontrol et
            const currentData = $currentRow.data('ruleData') || {};
            const currentType = currentData.rule_type || 'standard_discount';
            if (currentType !== 'standard_discount') {
                return;
            }

            // Kategori kontrolü
            const currentCategory = $currentRow.find('.knsdd-rule-category').val() || '';
            if (currentCategory !== refCategory) {
                return;
            }

            // Ürün seti kontrolü
            const currentProducts = ($currentRow.find('.knsdd-rule-product').val() || [])
                .map(v => String(v))
                .sort()
                .join(',');

            if (currentProducts !== refProducts) {
                return;
            }

            // Aynı kapsam → gruba ekle
            relatedRows.push($currentRow);
        });

        return relatedRows;
    };

    /**
     * Ürün veya kategori adını al (mesaj için)
     * @param {jQuery} $row - Satır
     * @returns {string} - Ürün/kategori adı
     */
    const getProductOrCategoryName = ($row) => {
        // Önce ürün adını dene
        const $productSelect = $row.find('.knsdd-rule-product');
        const selectedProducts = $productSelect.select2('data') || [];

        if (selectedProducts.length > 0) {
            if (selectedProducts.length === 1) {
                return selectedProducts[0].text;
            } else {
                // Birden fazla ürün varsa ilkini göster + "ve X diğer"
                const firstName = selectedProducts[0].text;
                const others = selectedProducts.length - 1;
                const othersText = knsdd_data.i18n.and_x_others || 've %d diğer ürün';
                return `${firstName} ${othersText.replace('%d', others)}`;
            }
        }

        // Ürün yoksa kategori adını dene
        const $categorySelect = $row.find('.knsdd-rule-category');
        const selectedCategory = $categorySelect.select2('data');

        if (selectedCategory && selectedCategory[0]) {
            return selectedCategory[0].text;
        }

        // Hiçbiri yoksa genel ifade
        return knsdd_data.i18n.this_rule || 'Bu kural';
    };

    /**
     * Limitler modalını açar ve ilgili kural verileriyle doldurur.
     * @param {jQuery} $row - Modalın açıldığı kural satırı.
     */
    const openLimitsModal = ($row) => {
        const ruleId = $row.data('rule-id');
        const ruleData = $row.data('ruleData') || {};
        const ruleType = ruleData.rule_type || 'standard_discount';

        $limitsModal.data('row', $row);

        // Tier grup tespiti (sadece miktar indirimi için)
        const $tbody = $row.closest('tbody');
        const relatedRows = findRelatedTierRows($row, $tbody);

        if (ruleType === 'standard_discount' && relatedRows.length > 1) {
            // Kademeli indirim tespit edildi
            const productName = getProductOrCategoryName($row);
            const tierCount = relatedRows.length;

            const title = (knsdd_data.i18n.tier_group_detected_title || '"%s" için Kademeli İndirim Tespit Edildi: %d kademe')
                .replace('%s', productName)
                .replace('%d', tierCount);

            const description = knsdd_data.i18n.tier_group_limits_shared ||
                'Toplam kullanım ve müşteri başına kullanım limitleri, tüm kademeler için ortak olarak uygulanır.';

            $('#knsdd-tier-info-title').text(title);
            $('#knsdd-tier-info-description').text(description);
            $('#knsdd-limits-tier-info').show();

            // İlk satırın limitini göster (hepsi aynı olmalı)
            const sharedLimit = relatedRows[0].data('ruleData').total_limit || 0;
            const sharedPerCustomer = relatedRows[0].data('ruleData').per_customer_limit || 0;

            $limitsModal.find('#knsdd-total-limit').val(sharedLimit > 0 ? sharedLimit : '');
            $limitsModal.find('#knsdd-per-customer-limit').val(sharedPerCustomer > 0 ? sharedPerCustomer : '');

            // İlgili satırları modal'a kaydet (kayıt sırasında kullanılacak)
            $limitsModal.data('relatedRows', relatedRows);
        } else {
            // Tek satır veya özel kampanya, normal limit
            $('#knsdd-limits-tier-info').hide();
            $limitsModal.find('#knsdd-total-limit').val(ruleData.total_limit > 0 ? ruleData.total_limit : '');
            $limitsModal.find('#knsdd-per-customer-limit').val(ruleData.per_customer_limit > 0 ? ruleData.per_customer_limit : '');
            $limitsModal.data('relatedRows', [$row]);
        }

        // Free sürümde kullanım limiti özelliği kilitli olduğundan ajax çağrısı yapılmaz.
        // Bu sayede kaldırılmış endpoint'lere istek atılmaz.
        const tpl = knsdd_data.i18n.total_usage || 'Toplam Kullanım: %d';
        $limitsModal.find('#knsdd-total-usage-stat').text(tpl.replace('%d', 0));

        // Doğrulama mesajı konteynerini hazırla ve konumlandır (formun hemen altı)
        const $form = $limitsModal.find('.knsdd-limits-form');
        let $v = $limitsModal.find('#knsdd-limits-validation-message');
        if ($v.length) {
            $v.detach();
            $form.after($v);
        } else {
            $form.after('<div id="knsdd-limits-validation-message" style="display:none; margin:10px 0 0;"></div>');
        }
        // İlk açılışta doğrula ve buton durumlarını ayarla
        validateLimitsInputs();

        // Süresi bitmiş kampanyalar için read-only modu uygula
        const groupName = $('#knsdd-select-group').val();
        const isExpired = KNSDDRules.utils && KNSDDRules.utils.isGroupExpired(groupName);

        if (isExpired) {
            // Input alanlarını disable et
            $limitsModal.find('input').prop('disabled', true);

            // Kaydet butonunu gizle
            $('#knsdd-save-limits').hide();

            // İptal butonunu "Kapat" yap
            const closeText = knsdd_data.i18n.close_button || 'Kapat';
            $('#knsdd-cancel-limits').text(closeText);
        } else {
            // Normal mod: input'ları enable et
            $limitsModal.find('input').prop('disabled', false);

            // Kaydet butonunu göster
            $('#knsdd-save-limits').show();

            // İptal butonunu "İptal" yap
            const cancelText = knsdd_data.i18n.cancel_button || 'İptal';
            $('#knsdd-cancel-limits').text(cancelText);
        }

        $limitsModal.show();
    };

    /**
     * Kampanya modalını açar ve ilgili kural verileriyle doldurur.
     * @param {jQuery} $row - Modalın açıldığı kural satırı.
     */
    const openCampaignModal = ($row) => {
        const ruleData = $row.data('ruleData');
        $campaignModal.data('row', $row);
        const $campaignTypeSelect = $campaignModal.find('#knsdd-campaign-type');
        $campaignTypeSelect.val(ruleData.campaign_type || '').trigger('change');
        $campaignModal.show();
    };

    /**
     * Mesajlar modalını açar ve ilgili kural verileriyle doldurur.
     * @param {jQuery} $row - Modalın açıldığı kural satırı.
     */
    const openMessagesModal = ($row) => {
        const ruleData = $row.data('ruleData') || {};
        const campaignType = ruleData.campaign_type || '';
        const isBOGO = (campaignType === 'buy_x_get_y_discount');
        const isCartTotal = (campaignType === 'cart_total_discount');

        $messagesModal.data('row', $row);

        // Ürün sekmesini göster/gizle (Sepet tutarı kampanyasında ürün sekmesi deaktif)
        const $productTab = $('.knsdd-tab[data-tab="product"]');
        const $productTabContent = $('.knsdd-tab-content[data-tab="product"]');
        const $cartTab = $('.knsdd-tab[data-tab="cart"]');

        if (isCartTotal) {
            // Sepet tutarı kampanyası: Ürün sekmesini gizle, sepet sekmesini aktif et
            $productTab.hide();
            $productTabContent.removeClass('is-active');
            $cartTab.addClass('is-active');
            $('.knsdd-tab-content[data-tab="cart"]').addClass('is-active');
        } else {
            // Diğer kampanyalar: Ürün sekmesini göster
            $productTab.show();
        }

        // BOGO sekmeleri göster/gizle
        if (isBOGO) {
            $('.knsdd-bogo-tabs').show();
            $('.knsdd-standard-message-form').hide();
            $('.knsdd-bogo-message-form[data-bogo-tab="trigger"]').show();
            $('.knsdd-bogo-message-form[data-bogo-tab="target"]').hide();
            $('.knsdd-bogo-overlap-info').show();
            $('.knsdd-bogo-cart-info').show();
        } else {
            $('.knsdd-bogo-tabs').hide();
            $('.knsdd-standard-message-form').show();
            $('.knsdd-bogo-message-form').hide();
            $('.knsdd-bogo-overlap-info').hide();
            $('.knsdd-bogo-cart-info').hide();
        }

        // Güvenli varsayılanlar (geri uyumluluk) – eski kurallar için messages yoksa doldur
        const defaults = {
            product: {
                text: '', color: '#000000', show: false,
                highlight: false,
                icon: { enabled: false, pack: 'iconify', value: 'tabler:star', color: '#000000', position: 'before', size: 'md' }
            },
            product_trigger: {
                text: '', color: '#000000', show: false,
                highlight: false,
                icon: { enabled: false, pack: 'iconify', value: 'tabler:star', color: '#000000', position: 'before', size: 'md' }
            },
            product_target: {
                text: '', color: '#000000', show: false,
                highlight: false,
                icon: { enabled: false, pack: 'iconify', value: 'tabler:star', color: '#000000', position: 'before', size: 'md' }
            },
            cart: {
                text: '', color: '#000000',
                show_mini: false, show_cart: false, show_checkout: false,
                highlight_mini: false, highlight_cart: false, highlight_checkout: false,
                icon: { enabled: false, pack: 'iconify', value: 'tabler:star', color: '#000000', position: 'before', size: 'md' }
            }
        };
        const messages = Object.assign({}, defaults, ruleData.messages || {});
        messages.product.icon = Object.assign({}, defaults.product.icon, messages.product && messages.product.icon || {});
        messages.product_trigger.icon = Object.assign({}, defaults.product_trigger.icon, messages.product_trigger && messages.product_trigger.icon || {});
        messages.product_target.icon = Object.assign({}, defaults.product_target.icon, messages.product_target && messages.product_target.icon || {});
        messages.cart.icon = Object.assign({}, defaults.cart.icon, messages.cart && messages.cart.icon || {});

        if (isBOGO) {
            // BOGO Tetikleyici mesaj alanları
            const tMsg = messages.product_trigger || {};
            $('#knsdd-message-product-trigger').val(tMsg.text || '');
            $('#knsdd-message-color-product-trigger').val(tMsg.color || '#000000');
            $('#knsdd-message-color-hex-product-trigger').val(tMsg.color || '#000000');
            $('#knsdd-show-product-trigger').prop('checked', !!tMsg.show);
            $('#knsdd-highlight-product-trigger').prop('checked', !!tMsg.highlight);

            const tIcon = tMsg.icon || {};
            $('#knsdd-icon-enabled-product-trigger').prop('checked', !!tIcon.enabled);
            const tVal = (tIcon.pack === 'iconify' && (tIcon.value || '').indexOf('tabler:') === 0) ? tIcon.value : 'tabler:' + TABLER_ICON_NAMES[0];
            const tKey = tVal.replace(/^tabler:/, '');
            $('#knsdd-icon-value-product-trigger').val(tVal);
            renderIconPreview($('#knsdd-icon-preview-product-trigger'), tKey);
            $('#knsdd-icon-color-product-trigger').val(tIcon.color || '#000000');
            $('#knsdd-icon-color-hex-product-trigger').val(tIcon.color || '#000000');
            $('#knsdd-icon-position-product-trigger').val(tIcon.position || 'before');
            $('#knsdd-icon-size-product-trigger').val(tIcon.size || 'md');

            // BOGO Hedef mesaj alanları
            const tarMsg = messages.product_target || {};
            $('#knsdd-message-product-target').val(tarMsg.text || '');
            $('#knsdd-message-color-product-target').val(tarMsg.color || '#000000');
            $('#knsdd-message-color-hex-product-target').val(tarMsg.color || '#000000');
            $('#knsdd-show-product-target').prop('checked', !!tarMsg.show);
            $('#knsdd-highlight-product-target').prop('checked', !!tarMsg.highlight);

            const tarIcon = tarMsg.icon || {};
            $('#knsdd-icon-enabled-product-target').prop('checked', !!tarIcon.enabled);
            const tarVal = (tarIcon.pack === 'iconify' && (tarIcon.value || '').indexOf('tabler:') === 0) ? tarIcon.value : 'tabler:' + TABLER_ICON_NAMES[0];
            const tarKey = tarVal.replace(/^tabler:/, '');
            $('#knsdd-icon-value-product-target').val(tarVal);
            renderIconPreview($('#knsdd-icon-preview-product-target'), tarKey);
            $('#knsdd-icon-color-product-target').val(tarIcon.color || '#000000');
            $('#knsdd-icon-color-hex-product-target').val(tarIcon.color || '#000000');
            $('#knsdd-icon-position-product-target').val(tarIcon.position || 'before');
            $('#knsdd-icon-size-product-target').val(tarIcon.size || 'md');

            applyIconVisibility('product-trigger');
            applyIconVisibility('product-target');
        } else {
            // Standart mesaj alanları
            $('#knsdd-message-product').val(messages.product.text);
            $('#knsdd-message-color-product').val(messages.product.color);
            $('#knsdd-message-color-hex-product').val(messages.product.color);
            $('#knsdd-show-product').prop('checked', !!messages.product.show);
            $('#knsdd-highlight-product').prop('checked', !!messages.product.highlight);

            const pIcon = messages.product.icon || {};
            $('#knsdd-icon-enabled-product').prop('checked', !!pIcon.enabled);
            const pVal = (pIcon.pack === 'iconify' && (pIcon.value || '').indexOf('tabler:') === 0) ? pIcon.value : 'tabler:' + TABLER_ICON_NAMES[0];
            const pKey = pVal.replace(/^tabler:/, '');
            $('#knsdd-icon-value-product').val(pVal);
            renderIconPreview($('#knsdd-icon-preview-product'), pKey);
            $('#knsdd-icon-color-product').val(pIcon.color || '#000000');
            $('#knsdd-icon-color-hex-product').val(pIcon.color || '#000000');
            $('#knsdd-icon-position-product').val(pIcon.position || 'before');
            $('#knsdd-icon-size-product').val(pIcon.size || 'md');

            applyIconVisibility('product');
        }

        // Cart mesajları (her iki durumda da aynı)
        $('#knsdd-message-cart').val(messages.cart.text);
        $('#knsdd-message-color-cart').val(messages.cart.color);
        $('#knsdd-message-color-hex-cart').val(messages.cart.color);

        // Sepet tutarı kampanyasında Mini Sepet checkbox'ını gizle
        const $miniCheckbox = $('#knsdd-show-mini').parent('label.knsdd-inline-show');
        if (isCartTotal) {
            $miniCheckbox.hide();
            $('#knsdd-show-mini').prop('checked', false);
        } else {
            $miniCheckbox.show();
            $('#knsdd-show-mini').prop('checked', !!messages.cart.show_mini);
        }

        $('#knsdd-show-cart').prop('checked', !!messages.cart.show_cart);
        $('#knsdd-show-checkout').prop('checked', !!messages.cart.show_checkout);
        $('#knsdd-highlight-cart').prop('checked', !!messages.cart.highlight);

        const cIcon = messages.cart.icon || {};
        $('#knsdd-icon-enabled-cart').prop('checked', !!cIcon.enabled);
        const cVal = (cIcon.pack === 'iconify' && (cIcon.value || '').indexOf('tabler:') === 0) ? cIcon.value : 'tabler:' + TABLER_ICON_NAMES[0];
        const cKey = cVal.replace(/^tabler:/, '');
        $('#knsdd-icon-value-cart').val(cVal);
        renderIconPreview($('#knsdd-icon-preview-cart'), cKey);
        $('#knsdd-icon-color-cart').val(cIcon.color || '#000000');
        $('#knsdd-icon-color-hex-cart').val(cIcon.color || '#000000');
        $('#knsdd-icon-position-cart').val(cIcon.position || 'before');
        $('#knsdd-icon-size-cart').val(cIcon.size || 'md');

        applyIconVisibility('cart');

        // Doğrulama mesajı için konteyner oluştur (yoksa)
        if (!$messagesModal.find('#knsdd-messages-validation-message').length) {
            $messagesModal.find('.knsdd-modal-content').prepend('<div id="knsdd-messages-validation-message" style="display:none; margin-bottom:10px;"></div>');
        }
        // İlk açılışta doğrulama durumunu değerlendir
        validateMessagesInputs();
        $messagesModal.show();
    };

    /**
     * Modülün olay dinleyicilerini ve başlangıç ayarlarını yapar.
     */
    const init = () => {
        $limitsModal = $('#knsdd-limits-modal');
        $campaignModal = $('#knsdd-campaign-modal');
        $messagesModal = $('#knsdd-messages-modal');

        // --- Modal Kapatma Olayları ---
        $('.knsdd-modal-close, #knsdd-cancel-limits, #knsdd-cancel-campaign').on('click', function () {
            $(this).closest('.knsdd-modal').hide();
        });

        // --- BOGO Mesaj Sekme Geçişi ---
        $(document).on('click', '.knsdd-bogo-tab', function () {
            const $btn = $(this);
            const tab = $btn.data('bogo-tab');

            $('.knsdd-bogo-tab').removeClass('is-active');
            $btn.addClass('is-active');

            $('.knsdd-bogo-message-form').hide();
            $(`.knsdd-bogo-message-form[data-bogo-tab="${tab}"]`).show();
        });

        // --- Limitler Modal Olayları ---
        $('#knsdd-save-limits').on('click', function () {
            if (!validateLimitsInputs()) { return; }

            const relatedRows = $limitsModal.data('relatedRows') || [];
            if (relatedRows.length === 0) return;

            const newTotalLimit = $('#knsdd-total-limit').val();
            const newPerCustomerLimit = $('#knsdd-per-customer-limit').val();

            // TÜM ilgili satırlara aynı limiti uygula
            relatedRows.forEach($r => {
                const rd = $r.data('ruleData') || {};
                rd.total_limit = newTotalLimit;
                rd.per_customer_limit = newPerCustomerLimit;
                $r.data('ruleData', rd);
            });

            $limitsModal.hide();

            // Mesaj: Tier grubu varsa özel mesaj
            const msg = relatedRows.length > 1
                ? (knsdd_data.i18n.limits_updated_for_tiers || 'Limitler %d kademe için güncellendi.').replace('%d', relatedRows.length)
                : (knsdd_data.i18n.limits_updated || 'Limitler kaydedildi.');

            showNotice('info', msg);
        });

        // --- Kampanya Modal Olayları ---
        const validateCampaignInputs = () => {
            const $validationMessage = $('#knsdd-campaign-validation-message');
            const $saveButton = $('#knsdd-save-campaign');
            const campaignType = $('#knsdd-campaign-type').val();

            $validationMessage.empty().hide();
            $saveButton.prop('disabled', false);

            if (campaignType === 'cart_total_discount') {
                const minTotal = parseFloat($('#knsdd-campaign-min-cart-total').val());
                const discountType = $('#knsdd-campaign-discount-type').val();
                const discountValue = parseFloat($('#knsdd-campaign-discount-value').val());

                if (isNaN(minTotal) || isNaN(discountValue)) {
                    // Henüz tüm alanlar doldurulmadıysa bir şey yapma
                    return true;
                }

                let error = '';
                if (minTotal <= 0 || discountValue <= 0) {
                    error = knsdd_data.i18n.error_positive_values;
                } else if (discountType === 'amount' && discountValue >= minTotal) {
                    error = knsdd_data.i18n.error_discount_val_vs_total;
                } else if (discountType === 'percentage' && discountValue >= 100) {
                    error = knsdd_data.i18n.error_percent_max;
                }

                if (error) {
                    // Ayar kontrolü: satır içi veya üstte göster
                    if (knsdd_data.settings && knsdd_data.settings.warning_location === 'top_notice') {
                        showNotice('warning', error);
                    } else {
                        $validationMessage.html(`<div class="knsdd-notice knsdd-notice-warning"><p>${error}</p></div>`).show();
                    }
                    $saveButton.prop('disabled', true);
                    return false;
                }
            }
            // Diğer kampanya türleri doğrulamaları
            else if (campaignType === 'buy_x_get_y_discount') {
                // BOGO modülü validasyonunu kullan
                if (typeof KNSDDModals.BOGO !== 'undefined' && KNSDDModals.BOGO.validate) {
                    return KNSDDModals.BOGO.validate($validationMessage, $saveButton);
                }
                // Fallback: Eski validasyon kodu burada kalacak (güvenlik için)
                return true;
            }
            else if (campaignType === 'buy_x_pay_y') {
                const buyX = parseInt($('#knsdd-campaign-buy-x').val(), 10);
                const payY = parseInt($('#knsdd-campaign-pay-y').val(), 10);
                if (isNaN(buyX) || isNaN(payY)) return true;

                if (!(buyX >= 1 && payY >= 0 && buyX > payY)) {
                    // Ayar kontrolü: satır içi veya üstte göster
                    if (knsdd_data.settings && knsdd_data.settings.warning_location === 'top_notice') {
                        showNotice('warning', knsdd_data.i18n.invalid_buyxpayy);
                    } else {
                        $validationMessage.html(`<div class="knsdd-notice knsdd-notice-warning"><p>${knsdd_data.i18n.invalid_buyxpayy}</p></div>`).show();
                    }
                    $saveButton.prop('disabled', true);
                    return false;
                }
            }
            else if (campaignType === 'nth_percent_off') {
                const nth = parseInt($('#knsdd-campaign-nth').val(), 10);
                const discountType = $('#knsdd-campaign-discount-type').val();
                const discountValue = parseFloat($('#knsdd-campaign-discount-value').val());

                if (isNaN(nth) || isNaN(discountValue)) return true; // henüz tamamlanmamış giriş

                let error = '';
                if (!(nth >= 1)) {
                    error = knsdd_data.i18n.invalid_nthpercent; // N >= 1 şartı
                } else if (discountType === 'percentage') {
                    if (discountValue <= 0 || discountValue >= 100) {
                        error = knsdd_data.i18n.error_percent_max || knsdd_data.i18n.invalid_nthpercent;
                    }
                } else { // amount
                    if (discountValue <= 0) {
                        error = knsdd_data.i18n.error_positive_values;
                    }
                }

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

            return true; // Geçerli
        };

        let campaignInfoTimer = null; // auto-hide timer for info box
        $('#knsdd-campaign-type').on('change', function () {
            const type = $(this).val();
            const $settingsDiv = $('#knsdd-campaign-settings');
            const $row = $campaignModal.data('row');
            const ruleData = $row ? ($row.data('ruleData') || {}) : {};
            const prevType = ruleData.campaign_type || '';

            // Akıllı temizlik: tür değiştiyse ve önceki türde veri varsa onay iste
            if (prevType && prevType !== type) {
                const hasData = checkIfPreviousTypeHasData(ruleData, prevType);

                if (hasData) {
                    // Modal içinde onay kutusu göster
                    const confirmMsg = (knsdd_data && knsdd_data.i18n && knsdd_data.i18n.campaign_switch_confirm)
                        ? knsdd_data.i18n.campaign_switch_confirm
                        : 'Kampanya türünü değiştirirseniz girdiğiniz veriler silinecek. Devam etmek istiyor musunuz?';

                    const $info = $('#knsdd-campaign-info-message');
                    const cancelBtnText = knsdd_data.i18n.cancel_button || 'Cancel';
                    const continueBtnText = knsdd_data.i18n.continue_button || 'Continue';
                    $info.html(`
                        <div class="knsdd-notice knsdd-notice-warning" style="margin: 15px 0;">
                            <p style="margin-bottom: 12px;">${confirmMsg}</p>
                            <div style="display: flex; gap: 10px;">
                                <button type="button" class="button button-secondary" id="knsdd-campaign-switch-cancel">${cancelBtnText}</button>
                                <button type="button" class="button button-primary" id="knsdd-campaign-switch-confirm">${continueBtnText}</button>
                            </div>
                        </div>
                    `).show();

                    // Modal alt butonlarını devre dışı bırak
                    const $modalFooterButtons = $campaignModal.find('.knsdd-modal-actions button');
                    $modalFooterButtons.prop('disabled', true).addClass('knsdd-temp-disabled');

                    // İptal butonu
                    $('#knsdd-campaign-switch-cancel').one('click', function () {
                        $('#knsdd-campaign-type').val(prevType).trigger('change.select2');
                        $info.empty().hide();
                        // Alt butonları tekrar aktif et
                        $modalFooterButtons.prop('disabled', false).removeClass('knsdd-temp-disabled');
                    });

                    // Devam Et butonu
                    $('#knsdd-campaign-switch-confirm').one('click', function () {
                        $info.empty().hide();
                        // Alt butonları tekrar aktif et
                        $modalFooterButtons.prop('disabled', false).removeClass('knsdd-temp-disabled');

                        // Temizle
                        clearAllSpecialKeys(ruleData);
                        ruleData.campaign_type = ''; // Kampanya türünü de sıfırla
                        if ($row) { $row.data('ruleData', ruleData); }

                        // Tooltip'i güncelle (render.js'deki updateRuleTypeUI çağrılacak)
                        if ($row && typeof KNSDDRules !== 'undefined' && KNSDDRules.render && KNSDDRules.render.updateRuleTypeUI) {
                            const $typeSelect = $row.find('.knsdd-rule-type');
                            if ($typeSelect.length) {
                                KNSDDRules.render.updateRuleTypeUI($typeSelect[0]);
                            }
                        }

                        // Başarı mesajı göster
                        const infoMsg = (knsdd_data && knsdd_data.i18n && knsdd_data.i18n.campaign_switched_cleared)
                            ? knsdd_data.i18n.campaign_switched_cleared
                            : 'Kampanya türü değiştirildi. Önceki türe ait alanlar temizlendi.';
                        showProminentWarning(infoMsg, 5000);

                        // Formu yeniden tetikle (change event'i tekrar çalıştır)
                        $('#knsdd-campaign-type').trigger('change');
                    });

                    // Formu çizme, onay bekle
                    return false;
                }

                // Veri yoksa direkt temizle
                clearAllSpecialKeys(ruleData);
                if ($row) { $row.data('ruleData', ruleData); }
            }
            $settingsDiv.empty();
            // Doğrulama mesajlarını temizleme sadece yeni alanları çizerken yapılır
            $('#knsdd-campaign-validation-message').empty().hide();
            // Ek uyarı alanı: sarı alanın ÜSTÜNE, rose temalı özel uyarı için konteyner ekle (yalnızca bir kez)
            (function ensureSameScopeWarningContainer() {
                const $vm = $('#knsdd-campaign-validation-message');
                if ($vm.length && !$('#knsdd-campaign-same-scope-warning').length) {
                    $vm.before('<div id="knsdd-campaign-same-scope-warning" style="display:none; margin:10px 0;"></div>');
                }
            })();
            $('#knsdd-save-campaign').prop('disabled', false);

            if (type === 'buy_x_pay_y') {
                $settingsDiv.html(`
                    <div class="knsdd-form-field"><label>${knsdd_data.i18n.buy_x_label}</label><input type="number" id="knsdd-campaign-buy-x" value="${ruleData.buy_x || ''}" min="1"></div>
                    <div class="knsdd-form-field"><label>${knsdd_data.i18n.pay_y_label}</label><input type="number" id="knsdd-campaign-pay-y" value="${ruleData.pay_y || ''}" min="0"></div>`);
            } else if (type === 'buy_x_get_y_discount') {
                // BOGO modülü yüklü mü kontrol et
                if (typeof KNSDDModals.BOGO !== 'undefined') {
                    KNSDDModals.BOGO.render(ruleData);
                } else {
                    console.error('BOGO modülü yüklenmedi!');
                    // Fallback: Eski fonksiyon (geçici)
                    renderBuyXGetYDiscountForm(ruleData);
                }
            } else if (type === 'nth_percent_off') {
                const existingType = (ruleData.discount_type === 'amount' || ruleData.discount_type === 'percentage') ? ruleData.discount_type : 'percentage';
                const existingValue = (typeof ruleData.discount_value !== 'undefined') ? ruleData.discount_value : '';
                $settingsDiv.html(`
                    <div class="knsdd-form-field"><label>${knsdd_data.i18n.nth_label}</label><input type="number" id="knsdd-campaign-nth" value="${ruleData.nth || ''}" min="1"></div>
                    <div class="knsdd-form-field">
                        <label>${knsdd_data.i18n.discount_type_label}</label>
                        <select id="knsdd-campaign-discount-type">
                            <option value="amount" ${existingType === 'amount' ? 'selected' : ''}>${knsdd_data.i18n.amount}</option>
                            <option value="percentage" ${existingType === 'percentage' ? 'selected' : ''}>${knsdd_data.i18n.percentage}</option>
                        </select>
                    </div>
                    <div class="knsdd-form-field">
                        <label>${knsdd_data.i18n.discount_amount_label}</label>
                        <input type="number" id="knsdd-campaign-discount-value" value="${existingValue || ''}" min="0" step="0.01">
                    </div>`);
            } else if (type === 'cart_total_discount') {
                const currency = knsdd_data.i18n.currency || '₺';
                const existingType = (ruleData.discount_type === 'amount' || ruleData.discount_type === 'percentage') ? ruleData.discount_type : 'percentage';
                $settingsDiv.html(`
                    <div class="knsdd-form-field">
                        <label>${knsdd_data.i18n.min_cart_total_label}</label>
                        <input type="number" id="knsdd-campaign-min-cart-total" value="${ruleData.min_cart_total || ''}" min="0" step="0.01" placeholder="0.00 ${currency}">
                    </div>
                    <div class="knsdd-form-field">
                        <label>${knsdd_data.i18n.discount_type_label}</label>
                        <select id="knsdd-campaign-discount-type">
                            <option value="amount" ${existingType === 'amount' ? 'selected' : ''}>${knsdd_data.i18n.amount}</option>
                            <option value="percentage" ${existingType === 'percentage' ? 'selected' : ''}>${knsdd_data.i18n.percentage}</option>
                        </select>
                    </div>
                    <div class="knsdd-form-field">
                        <label>${knsdd_data.i18n.discount_amount_label}</label>
                        <input type="number" id="knsdd-campaign-discount-value" value="${ruleData.discount_value || ''}" min="0" step="0.01">
                    </div>`);
            }
            validateCampaignInputs();
        });

        // Anlık doğrulama için olay dinleyicisi
        $('#knsdd-campaign-settings').on('input change', 'input, select', function () {
            const campaignType = $('#knsdd-campaign-type').val();
            // BOGO için özel validasyon
            if (campaignType === 'buy_x_get_y_discount') {
                if (typeof KNSDDModals.BOGO !== 'undefined' && KNSDDModals.BOGO.validate) {
                    KNSDDModals.BOGO.validate($('#knsdd-campaign-validation-message'), $('#knsdd-save-campaign'));
                }
            } else {
                validateCampaignInputs();
            }
        });

        // Limitler modalı için anlık doğrulama
        $(document).on('input change', '#knsdd-total-limit, #knsdd-per-customer-limit', validateLimitsInputs);


        $('#knsdd-save-campaign').on('click', function () {
            const campaignType = $('#knsdd-campaign-type').val();

            // BOGO için özel validasyon
            if (campaignType === 'buy_x_get_y_discount') {
                if (typeof KNSDDModals.BOGO !== 'undefined' && KNSDDModals.BOGO.validate) {
                    if (!KNSDDModals.BOGO.validate($('#knsdd-campaign-validation-message'), $('#knsdd-save-campaign'))) {
                        return;
                    }
                }
            } else {
                if (!validateCampaignInputs()) {
                    return;
                }
            }

            const $row = $campaignModal.data('row');
            if (!$row) return;
            const ruleData = $row.data('ruleData');
            const previousCampaignType = ruleData.campaign_type || '';
            ruleData.campaign_type = campaignType;
            // Güvence: Sadece kampanya türü değiştiyse önceki özel alanları temizle
            if (previousCampaignType && previousCampaignType !== campaignType) {
                clearAllSpecialKeys(ruleData);
            }

            if (campaignType === 'buy_x_pay_y') {
                ruleData.buy_x = parseInt($('#knsdd-campaign-buy-x').val(), 10);
                ruleData.pay_y = parseInt($('#knsdd-campaign-pay-y').val(), 10);
            } else if (campaignType === 'buy_x_get_y_discount') {
                // BOGO modülü veri toplama fonksiyonunu kullan
                if (typeof KNSDDModals !== 'undefined' && typeof KNSDDModals.BOGO !== 'undefined' && typeof KNSDDModals.BOGO.collectData === 'function') {
                    const updatedData = KNSDDModals.BOGO.collectData(ruleData);
                    Object.assign(ruleData, updatedData);
                } else {
                    console.error('BOGO modülü yüklenmedi! Kontrol edin:', typeof KNSDDModals, typeof KNSDDModals.BOGO);
                    return;
                }
            } else if (campaignType === 'nth_percent_off') {
                ruleData.nth = parseInt($('#knsdd-campaign-nth').val(), 10);
                ruleData.discount_type = $('#knsdd-campaign-discount-type').val();
                ruleData.discount_value = parseFloat($('#knsdd-campaign-discount-value').val());
            } else if (campaignType === 'cart_total_discount') {
                ruleData.min_cart_total = parseFloat($('#knsdd-campaign-min-cart-total').val());
                ruleData.discount_type = $('#knsdd-campaign-discount-type').val();
                ruleData.discount_value = parseFloat($('#knsdd-campaign-discount-value').val());
            }

            $row.data('ruleData', ruleData);
            KNSDDRules.render.updateRuleTypeUI($row);
            $campaignModal.hide();
            showNotice('info', knsdd_data.i18n.campaign_updated);

            // BOGO: Ayarlar değiştiyse mesaj uyarısı göster
            if (campaignType === 'buy_x_get_y_discount' && ruleData._bogo_settings_changed) {
                const ruleId = ruleData.rule_id || $row.attr('data-rule-id') || '';
                const warningMsg = (knsdd_data.i18n && knsdd_data.i18n.bogo_settings_changed_warning)
                    ? knsdd_data.i18n.bogo_settings_changed_warning.replace('%RULE_ID%', ruleId)
                    : ('Kampanya ayarlarını değiştirdiniz. Mesajları gözden geçirin: <a href="#" class="knsdd-open-messages-from-warning" data-rule-id="' + ruleId + '">Mesajları Düzenle</a>');

                setTimeout(() => {
                    showNotice('warning', warningMsg);
                }, 4500); // Yeşil "Kampanya güncellendi" mesajı görünsün (4 saniye), sonra BOGO uyarısı

                // Flag'i temizle
                delete ruleData._bogo_settings_changed;
            }
        });

        // --- Mesajlar Modal Olayları ---
        // Not: validateMessagesInputs modül kapsamındadır ve burada sadece kullanılır.

        // BOGO uyarısından mesaj modalını aç
        $(document).on('click', '.knsdd-open-messages-from-warning', function (e) {
            e.preventDefault();
            const ruleId = $(this).data('rule-id');
            if (!ruleId) return;

            const $row = $('#knsdd-rules-tbody').find('tr[data-rule-id="' + ruleId + '"]');
            if ($row.length) {
                KNSDDRules.modals.openMessagesModal($row);
            }
        });

        // Mesajlar modalı: alan değişimlerinde doğrulama
        $(document).on('input change', '#knsdd-messages-modal input, #knsdd-messages-modal select, #knsdd-messages-modal textarea', validateMessagesInputs);

        $('#knsdd-save-messages').on('click', function () {
            if (!validateMessagesInputs()) {
                return;
            }
            const $row = $messagesModal.data('row');
            if (!$row) return;
            const ruleData = $row.data('ruleData');
            const campaignType = ruleData.campaign_type || '';
            const isBOGO = (campaignType === 'buy_x_get_y_discount');

            const normalizeIcon = (raw) => {
                const key = (raw || '').replace(/^tabler:/, '');
                const safeKey = TABLER_ICON_NAMES.indexOf(key) !== -1 ? key : 'star';
                return 'tabler:' + safeKey;
            };

            if (isBOGO) {
                // BOGO mesajları kaydet
                const triggerIconRaw = ($('#knsdd-icon-value-product-trigger').val() || '').trim();
                const targetIconRaw = ($('#knsdd-icon-value-product-target').val() || '').trim();
                const cartIconRaw = ($('#knsdd-icon-value-cart').val() || '').trim();

                ruleData.messages = {
                    product: ruleData.messages?.product || { text: '', color: '#000000', show: false, highlight: false, icon: {} },
                    product_trigger: {
                        text: $('#knsdd-message-product-trigger').val(),
                        color: $('#knsdd-message-color-product-trigger').val(),
                        show: $('#knsdd-show-product-trigger').is(':checked'),
                        highlight: $('#knsdd-highlight-product-trigger').is(':checked'),
                        icon: {
                            enabled: $('#knsdd-icon-enabled-product-trigger').is(':checked'),
                            pack: 'iconify',
                            value: normalizeIcon(triggerIconRaw),
                            color: $('#knsdd-icon-color-product-trigger').val(),
                            position: $('#knsdd-icon-position-product-trigger').val(),
                            size: $('#knsdd-icon-size-product-trigger').val()
                        }
                    },
                    product_target: {
                        text: $('#knsdd-message-product-target').val(),
                        color: $('#knsdd-message-color-product-target').val(),
                        show: $('#knsdd-show-product-target').is(':checked'),
                        highlight: $('#knsdd-highlight-product-target').is(':checked'),
                        icon: {
                            enabled: $('#knsdd-icon-enabled-product-target').is(':checked'),
                            pack: 'iconify',
                            value: normalizeIcon(targetIconRaw),
                            color: $('#knsdd-icon-color-product-target').val(),
                            position: $('#knsdd-icon-position-product-target').val(),
                            size: $('#knsdd-icon-size-product-target').val()
                        }
                    },
                    cart: {
                        text: $('#knsdd-message-cart').val(),
                        color: $('#knsdd-message-color-cart').val(),
                        show_mini: $('#knsdd-show-mini').is(':checked'),
                        show_cart: $('#knsdd-show-cart').is(':checked'),
                        show_checkout: $('#knsdd-show-checkout').is(':checked'),
                        highlight: $('#knsdd-highlight-cart').is(':checked'),
                        icon: {
                            enabled: $('#knsdd-icon-enabled-cart').is(':checked'),
                            pack: 'iconify',
                            value: normalizeIcon(cartIconRaw),
                            color: $('#knsdd-icon-color-cart').val(),
                            position: $('#knsdd-icon-position-cart').val(),
                            size: $('#knsdd-icon-size-cart').val()
                        }
                    }
                };
            } else {
                // Standart mesajları kaydet
                const prodIconRaw = ($('#knsdd-icon-value-product').val() || '').trim();
                const cartIconRaw = ($('#knsdd-icon-value-cart').val() || '').trim();

                ruleData.messages = {
                    product: {
                        text: $('#knsdd-message-product').val(),
                        color: $('#knsdd-message-color-product').val(),
                        show: $('#knsdd-show-product').is(':checked'),
                        highlight: $('#knsdd-highlight-product').is(':checked'),
                        icon: {
                            enabled: $('#knsdd-icon-enabled-product').is(':checked'),
                            pack: 'iconify',
                            value: normalizeIcon(prodIconRaw),
                            color: $('#knsdd-icon-color-product').val(),
                            position: $('#knsdd-icon-position-product').val(),
                            size: $('#knsdd-icon-size-product').val()
                        }
                    },
                    cart: {
                        text: $('#knsdd-message-cart').val(),
                        color: $('#knsdd-message-color-cart').val(),
                        show_mini: $('#knsdd-show-mini').is(':checked'),
                        show_cart: $('#knsdd-show-cart').is(':checked'),
                        show_checkout: $('#knsdd-show-checkout').is(':checked'),
                        highlight: $('#knsdd-highlight-cart').is(':checked'),
                        icon: {
                            enabled: $('#knsdd-icon-enabled-cart').is(':checked'),
                            pack: 'iconify',
                            value: normalizeIcon(cartIconRaw),
                            color: $('#knsdd-icon-color-cart').val(),
                            position: $('#knsdd-icon-position-cart').val(),
                            size: $('#knsdd-icon-size-cart').val()
                        }
                    }
                };
            }

            $row.data('ruleData', ruleData);
            // Kategori/Ürün kutucuklarının durumunu güncelle (kampanya türüne göre aktif/deaktif)
            KNSDDRules.render.updateRuleTypeUI($row);
            $messagesModal.hide();
            showNotice('info', knsdd_data.i18n.messages_updated);
        });

        $messagesModal.on('input', '#knsdd-message-color-product', function () { $('#knsdd-message-color-hex-product').val($(this).val()); });
        $messagesModal.on('input', '#knsdd-message-color-hex-product', function () { $('#knsdd-message-color-product').val($(this).val()); });
        $messagesModal.on('input', '#knsdd-message-color-cart', function () { $('#knsdd-message-color-hex-cart').val($(this).val()); });
        $messagesModal.on('input', '#knsdd-message-color-hex-cart', function () { $('#knsdd-message-color-cart').val($(this).val()); });

        // BOGO mesaj renk senkronizasyonu
        $messagesModal.on('input', '#knsdd-message-color-product-trigger', function () { $('#knsdd-message-color-hex-product-trigger').val($(this).val()); });
        $messagesModal.on('input', '#knsdd-message-color-hex-product-trigger', function () { $('#knsdd-message-color-product-trigger').val($(this).val()); });
        $messagesModal.on('input', '#knsdd-message-color-product-target', function () { $('#knsdd-message-color-hex-product-target').val($(this).val()); });
        $messagesModal.on('input', '#knsdd-message-color-hex-product-target', function () { $('#knsdd-message-color-product-target').val($(this).val()); });

        // Icon enabled visibility (paket, seçim, renk, konum, boyut)
        $messagesModal.on('change', '#knsdd-icon-enabled-product', function () { applyIconVisibility('product'); });
        $messagesModal.on('change', '#knsdd-icon-enabled-cart', function () { applyIconVisibility('cart'); });
        $messagesModal.on('change', '#knsdd-icon-enabled-product-trigger', function () { applyIconVisibility('product-trigger'); });
        $messagesModal.on('change', '#knsdd-icon-enabled-product-target', function () { applyIconVisibility('product-target'); });

        // Icon color hex sync
        $messagesModal.on('input', '#knsdd-icon-color-product', function () { $('#knsdd-icon-color-hex-product').val($(this).val()); });
        $messagesModal.on('input', '#knsdd-icon-color-hex-product', function () { $('#knsdd-icon-color-product').val($(this).val()); });
        $messagesModal.on('input', '#knsdd-icon-color-cart', function () { $('#knsdd-icon-color-hex-cart').val($(this).val()); });
        $messagesModal.on('input', '#knsdd-icon-color-hex-cart', function () { $('#knsdd-icon-color-cart').val($(this).val()); });

        // BOGO ikon renk senkronizasyonu
        $messagesModal.on('input', '#knsdd-icon-color-product-trigger', function () { $('#knsdd-icon-color-hex-product-trigger').val($(this).val()); });
        $messagesModal.on('input', '#knsdd-icon-color-hex-product-trigger', function () { $('#knsdd-icon-color-product-trigger').val($(this).val()); });
        $messagesModal.on('input', '#knsdd-icon-color-product-target', function () { $('#knsdd-icon-color-hex-product-target').val($(this).val()); });
        $messagesModal.on('input', '#knsdd-icon-color-hex-product-target', function () { $('#knsdd-icon-color-product-target').val($(this).val()); });

        // Tabs: Ürün / Sepet & Ödeme
        $messagesModal.on('click', '.knsdd-tab', function () {
            const tab = $(this).data('tab');
            // Buton durumu
            $(this).addClass('is-active').siblings('.knsdd-tab').removeClass('is-active');
            // İçerik geçişi
            $messagesModal.find('.knsdd-tab-content').removeClass('is-active').filter(`[data-tab="${tab}"]`).addClass('is-active');
        });

        // --- İkon Picker mantığı ---
        let pickerTarget = null; // 'product' | 'cart'
        function openIconPicker(scope) {
            pickerTarget = scope;
            const $grid = $('#knsdd-icon-picker .knsdd-icon-grid');
            $grid.empty();
            TABLER_ICON_NAMES.forEach(function (name) {
                const $item = $('<button type="button" class="knsdd-icon-item" aria-label="' + name + '"></button>');
                $item.html('<iconify-icon icon="tabler:' + name + '" style="font-size:24px;"></iconify-icon>');
                $item.data('iconKey', name);
                $grid.append($item);
            });
            $('#knsdd-icon-picker').addClass('is-open');
        }

        // Aç
        $messagesModal.on('click', '.knsdd-open-icon-picker', function () {
            const scope = $(this).data('scope');
            openIconPicker(scope);
        });

        // Seçim: tıklandığında anında uygula ve kapat
        $(document).on('click', '#knsdd-icon-picker .knsdd-icon-item', function () {
            const key = $(this).data('iconKey');
            if (pickerTarget === 'product') {
                $('#knsdd-icon-value-product').val('tabler:' + key);
                renderIconPreview($('#knsdd-icon-preview-product'), key);
            } else if (pickerTarget === 'cart') {
                $('#knsdd-icon-value-cart').val('tabler:' + key);
                renderIconPreview($('#knsdd-icon-preview-cart'), key);
            }
            $('#knsdd-icon-picker').removeClass('is-open');
            pickerTarget = null;
        });
        // Kapat (X tuşu)
        $(document).on('click', '.knsdd-icon-picker-close', function () {
            $('#knsdd-icon-picker').removeClass('is-open');
            pickerTarget = null;
        });

        // Overlay'e tıklayınca kapat (sadece arka plana basıldığında)
        $(document).on('mousedown', '#knsdd-icon-picker', function (e) {
            if (e.target === this) {
                $('#knsdd-icon-picker').removeClass('is-open');
                pickerTarget = null;
            }
        });

        // ESC ile kapat
        $(document).on('keydown', function (e) {
            if (e.key === 'Escape' && $('#knsdd-icon-picker').hasClass('is-open')) {
                $('#knsdd-icon-picker').removeClass('is-open');
                pickerTarget = null;
            }
        });

        // Serbest metin girişini önlemek için ikon değer alanlarını salt-okunur yap
        $('#knsdd-icon-value-product').attr('readonly', true);
        $('#knsdd-icon-value-cart').attr('readonly', true);
    };

    // Dışarıya açılacak fonksiyonlar
    return {
        init: init,
        openLimitsModal: openLimitsModal,
        openCampaignModal: openCampaignModal,
        openMessagesModal: openMessagesModal
    };

})(jQuery);
