/**
 * KNSDD Kural Yönetimi - Arayüz Çizim Modülü
 *
 * Bu dosya, kural satırlarının ve diğer UI bileşenlerinin oluşturulması,
 * güncellenmesi ve yönetilmesiyle ilgili tüm fonksiyonları içerir.
 */
window.KNSDDRules = window.KNSDDRules || {};

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

    /**
     * Kural tipine göre (standart indirim / özel kampanya) satırın ilgili bölümünü günceller.
     * Artık dropdown yerine sabit metin gösterir (grup tipine göre tek seçenek).
     * @param {HTMLElement|jQuery} element - Satır veya display elementi.
     */
    const updateRuleTypeUI = (element) => {
        const $row = $(element).closest('tr');
        if (!$row.length) return;

        const $configWrapper = $row.find('.knsdd-rule-config-wrapper');
        const $display = $row.find('.knsdd-rule-type-display');
        const ruleData = $row.data('ruleData') || {};
        const ruleType = ruleData.rule_type || 'standard_discount';
        const $minInput = $row.find('.knsdd-rule-min');
        const $maxInput = $row.find('.knsdd-rule-max');

        $configWrapper.empty();

        // Kural tipi gösterimini güncelle (sabit metin, dropdown değil)
        const typeLabel = ruleType === 'special_campaign'
            ? (knsdd_data.i18n.special_campaign || 'Özel Kampanya')
            : (knsdd_data.i18n.quantity_discount || 'Miktar İndirimi');
        $display.html(`<span class="knsdd-rule-type-badge knsdd-badge-${ruleType}">${typeLabel}</span>`);

        if (ruleType === 'standard_discount') {
            // Kategori/Ürün/Min/Max alanlarını etkinleştir
            $row.find('.knsdd-rule-category, .knsdd-rule-product, .knsdd-rule-min, .knsdd-rule-max')
                .prop('disabled', false)
                .attr('title', '');
            $row.find('.knsdd-category-select-wrapper, .knsdd-product-select-wrapper').removeAttr('title');

            // Özel kampanyadan dönüldüyse min/max'ı geri yükle
            if (ruleData.__suspended_range) {
                const r = ruleData.__suspended_range;
                $minInput.val((typeof r.min !== 'undefined' && r.min !== null) ? r.min : 0);
                $maxInput.val((typeof r.max !== 'undefined' && r.max !== null) ? r.max : 0);
                delete ruleData.__suspended_range;
                $row.data('ruleData', ruleData);
            }

            const discountType = ruleData.discount_type || 'percent';
            const discountValue = ruleData.discount_value || ''; // Boş string olarak başlat
            const html = `
                <div class="knsdd-standard-discount-config">
                    <select class="knsdd-rule-discount-type">
                        <option value="percent" ${discountType === 'percent' ? 'selected' : ''}>${knsdd_data.i18n.percent || '%'}</option>
                        <option value="fixed" ${discountType === 'fixed' ? 'selected' : ''}>${knsdd_data.i18n.currency || '₺'}</option>
                    </select>
                    <input type="number" class="knsdd-rule-discount-value" value="${discountValue}" min="0" step="0.01">
                </div>`;
            $configWrapper.html(html);

            // İkonu gizle (sadece özel kampanyalarda görünmeli)
            $row.find('.knsdd-info-tooltip').remove();
        } else if (ruleType === 'special_campaign') {
            // Min/Max alanlarını devre dışı bırak ve not ekle
            const note = knsdd_data.i18n.special_min_max_note || 'Özel kampanyalarda Min/Max kullanılmaz.';
            // Mevcut min/max değerlerini askıya al ve UI'da 0 göster
            if (!ruleData.__suspended_range) {
                const prevMin = parseFloat($minInput.val());
                const prevMax = parseFloat($maxInput.val());
                ruleData.__suspended_range = {
                    min: isNaN(prevMin) ? 0 : prevMin,
                    max: isNaN(prevMax) ? 0 : prevMax
                };
                $row.data('ruleData', ruleData);
            }
            $minInput.val(0);
            $maxInput.val(0);
            $row.find('.knsdd-rule-min, .knsdd-rule-max')
                .prop('disabled', true)
                .attr('title', note);

            const campaignType = ruleData.campaign_type || '';
            let summary = knsdd_data.i18n.not_configured || 'Yapılandırılmadı';

            if (campaignType === 'buy_x_pay_y') {
                // Sadece değerler varsa özet göster
                if (ruleData.buy_x && ruleData.pay_y) {
                    summary = (knsdd_data.i18n.buy_x_pay_y_summary || '%1$s Al, %2$s Öde')
                        .replace('%1$s', ruleData.buy_x)
                        .replace('%2$s', ruleData.pay_y);
                }
            } else if (campaignType === 'buy_x_get_y_discount') {
                // En az trigger ve target quantity varsa özet göster
                if (ruleData.trigger_quantity && ruleData.target_quantity) {
                    const triggerName = getBuyXGetYScopeName(ruleData, 'trigger');
                    const targetName = getBuyXGetYScopeName(ruleData, 'target');
                    const discountText = getBuyXGetYDiscountText(ruleData);
                    summary = (knsdd_data.i18n.buy_x_get_y_summary || '%1$s (%2$s) al → %3$s (%4$s) %5$s')
                        .replace('%1$s', triggerName)
                        .replace('%2$s', ruleData.trigger_quantity)
                        .replace('%3$s', targetName)
                        .replace('%4$s', ruleData.target_quantity)
                        .replace('%5$s', discountText);
                }
            } else if (campaignType === 'nth_percent_off') {
                // Sadece nth ve discount_value varsa özet göster
                if (ruleData.nth && ruleData.discount_value) {
                    const dtype = (ruleData.discount_type === 'amount' || ruleData.discount_type === 'percentage')
                        ? ruleData.discount_type
                        : 'percentage';
                    const dval = ruleData.discount_value;
                    const currency = knsdd_data.i18n.currency || '₺';
                    const valueLabel = (dtype === 'percentage')
                        ? (dval + '%')
                        : (dval + ' ' + currency);
                    summary = (knsdd_data.i18n.nth_percent_off_summary || "%1$s'inci ürüne %2$s indirim")
                        .replace('%1$s', ruleData.nth)
                        .replace('%2$s', valueLabel);
                }
            } else if (campaignType === 'cart_total_discount') {
                // Sadece min_cart_total ve discount_value varsa özet göster
                if (ruleData.min_cart_total && ruleData.discount_value) {
                    const amount = ruleData.discount_value;
                    const currency = knsdd_data.i18n.currency || '₺';
                    const symbol = ruleData.discount_type === 'percentage' ? '%' : ` ${currency}`;
                    summary = (knsdd_data.i18n.cart_total_discount_summary || '%1$s ve üzerine %2$s indirim')
                        .replace('%1$s', ruleData.min_cart_total + ` ${currency}`)
                        .replace('%2$s', amount + symbol);
                }
            }

            // Özel kampanyalarda Kategori/Ürün alanlarını yönet
            const $categorySelect = $row.find('.knsdd-rule-category');
            const $productSelect = $row.find('.knsdd-rule-product');
            const $wrappers = $row.find('.knsdd-category-select-wrapper, .knsdd-product-select-wrapper');

            if (campaignType === 'cart_total_discount' || campaignType === 'buy_x_get_y_discount') {
                const note = (campaignType === 'cart_total_discount')
                    ? (knsdd_data.i18n.special_cart_total_note || 'Sepet tutarı kampanyalarında Kategori/Ürün seçimi devre dışı bırakılır.')
                    : (knsdd_data.i18n.special_bogo_note || 'A Al, B\'ye İndirim kampanyalarında Kategori/Ürün seçimi modal içinden yapılır.');
                $categorySelect.prop('disabled', true).val(null).trigger('change');
                $productSelect.prop('disabled', true).val(null).trigger('change');
                $wrappers.attr('title', note);
            } else {
                $categorySelect.prop('disabled', false);
                $productSelect.prop('disabled', false);
                $wrappers.removeAttr('title');
            }

            // Kampanya yapılandırılmış mı kontrol et
            const isConfigured = (campaignType && summary !== (knsdd_data.i18n.not_configured || 'Yapılandırılmadı'));
            const buttonText = isConfigured
                ? (knsdd_data.i18n.configured || 'Yapılandırıldı')
                : (knsdd_data.i18n.configure || 'Yapılandır');
            const tooltipClass = isConfigured ? 'knsdd-info-tooltip-configured' : '';
            const buttonClass = isConfigured ? 'configured' : '';

            const html = `
                <div class="knsdd-special-campaign-config">
                    <button type="button" class="button knsdd-configure-campaign-btn ${buttonClass}">${buttonText}</button>
                    <span class="knsdd-info-tooltip knsdd-info-tooltip-large ${tooltipClass}" title="${summary}">
                        <svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" 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>
                </div>`;
            $configWrapper.html(html);
        }
    };

    // Select2 helper fonksiyonları artık KNSDDSelect2 modülünden kullanılıyor

    /**
     * Verilen kural verisine göre yeni bir tablo satırı (<tr>) oluşturur ve jQuery nesnesi olarak döndürür.
     * Select2 gibi kütüphaneleri bu satır için başlatır.
     * @param {object} [rule={}] - Kural verilerini içeren nesne. Boş ise varsayılan bir satır oluşturulur.
     */
    const ruleRow = (rule = {}) => {
        const catOpts = knsdd_data.categories.map(c => `<option value="${c.id}" ${String(rule.category) == String(c.id) ? 'selected' : ''}>${c.name}</option>`).join('');
        const initialProdOpts = (rule.product_details || []).map(p => {
            const esc = (v) => (v === null || typeof v === 'undefined') ? '' : String(v).replace(/"/g, '&quot;');
            const thumb = esc(p.thumb);
            const sku = esc(p.sku);
            const status = esc(p.stock_status);
            const mstock = (p.manage_stock === 1 || p.manage_stock === true) ? '1' : '0';
            const qtyStr = (typeof p.stock_qty === 'number') ? String(p.stock_qty) : esc(p.stock_qty);
            return `<option value="${p.id}" selected data-thumb="${thumb}" data-sku="${sku}" data-stock-status="${status}" data-manage-stock="${mstock}" data-stock-qty="${qtyStr}">${p.name}</option>`;
        }).join('');
        const initialCustomerOpts = (rule.allowed_customer_details || []).map(c => `<option value="${c.id}" selected>${c.name}</option>`).join('');
        const initialCustomersCount = Array.isArray(rule.allowed_customers) ? rule.allowed_customers.length : ((rule.allowed_customer_details || []).length);
        const initialHasCustomers = initialCustomersCount > 0;
        const ruleId = rule.rule_id || '';
        const ruleType = rule.rule_type || 'standard_discount';

        // Güvenli boolean parse: 'false', '0', 0 vb. değerleri yanlışlıkla true yapmayı engeller
        const parseBool = (v) => {
            if (typeof v === 'boolean') return v;
            if (typeof v === 'number') return v === 1;
            if (typeof v === 'string') {
                const s = v.trim().toLowerCase();
                return s === '1' || s === 'true' || s === 'yes' || s === 'on';
            }
            if (v === null || typeof v === 'undefined') return false;
            return !!v;
        };
        const initialFirstOrder = ('first_order_only' in rule)
            ? parseBool(rule.first_order_only)
            : parseBool(rule.ext && rule.ext.first_order_only);
        const initialLoginRequired = parseBool(rule.login_required);

        const rowHtml = `
            <tr data-rule-id="${ruleId}" data-rule-type="${ruleType}">
                <td class="knsdd-rule-type-cell">
                    <div class="knsdd-rule-type-display"></div>
                    <div class="knsdd-rule-config-wrapper"></div>
                </td>
                <td>
                    <div class="knsdd-category-select-wrapper">
                        <label class="knsdd-category-label">${knsdd_data.i18n.select_category}</label>
                        <select class="knsdd-rule-category"><option value=""></option>${catOpts}</select>
                    </div>
                </td>
                <td>
                    <div class="knsdd-product-select-wrapper">
                        <div class="knsdd-select-header">
                            <label class="knsdd-product-label">${knsdd_data.i18n.select_product}</label>
                            <button type="button" class="knsdd-clear-selection-btn knsdd-clear-products" title="${(knsdd_data.i18n.clear_all || 'Tümünü sil')}" aria-label="${(knsdd_data.i18n.clear_all || 'Tümünü sil')}">
                                <svg aria-hidden="true" viewBox="0 0 16 16" width="16" height="16" fill="none" stroke="currentColor" stroke-width="2.75" stroke-linecap="round" stroke-linejoin="round"><line x1="15" y1="1" x2="1" y2="15"></line><line x1="1" y1="1" x2="15" y2="15"></line></svg>
                            </button>
                        </div>
                        <select class="knsdd-rule-product" multiple="multiple">${initialProdOpts}</select>
                    </div>
                </td>
                <td>
                    <div class="knsdd-inline-label-wrapper">
                        <label class="knsdd-inline-label">${knsdd_data.i18n.min_label}</label>
                        <input type="number" class="knsdd-rule-min" value="${rule.min || 0}" min="0">
                    </div>
                </td>
                <td>
                    <div class="knsdd-inline-label-wrapper">
                        <label class="knsdd-inline-label">${knsdd_data.i18n.max_label}</label>
                        <input type="number" class="knsdd-rule-max" value="${rule.max || 0}" min="0">
                    </div>
                </td>
                <td class="knsdd-login-required-cell">
                    <div class="knsdd-inline-label-wrapper">
                        <label class="knsdd-inline-label">${knsdd_data.i18n.members_only_label}</label>
                        <input type="checkbox" class="knsdd-rule-login-required" ${initialLoginRequired ? 'checked' : ''} title="${knsdd_data.i18n.login_required_tooltip || ''}" aria-label="${knsdd_data.i18n.members_only_label}">
                        <label class="knsdd-inline-label">${knsdd_data.i18n.first_order_label || 'İlk Sipariş'}</label>
                        <input type="checkbox" class="knsdd-rule-first-order" ${initialFirstOrder ? 'checked' : ''} title="${knsdd_data.i18n.first_order_tooltip || ''}" aria-label="${knsdd_data.i18n.first_order_label || 'İlk Sipariş'}">
                    </div>
                </td>
                <td>
                    <div class="knsdd-customer-select-wrapper">
                        <div class="knsdd-select-header">
                            <label class="knsdd-customer-label">${knsdd_data.i18n.select_customer}</label>
                            <button type="button" class="knsdd-clear-selection-btn knsdd-clear-customers" title="${(knsdd_data.i18n.clear_all || 'Tümünü sil')}" aria-label="${(knsdd_data.i18n.clear_all || 'Tümünü sil')}">
                                <svg aria-hidden="true" viewBox="0 0 16 16" width="16" height="16" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round"><line x1="15" y1="1" x2="1" y2="15"></line><line x1="1" y1="1" x2="15" y2="15"></line></svg>
                            </button>
                        </div>
                        <select class="knsdd-customer-select" multiple="multiple">${initialCustomerOpts}</select>
                    </div>
                </td>
                <td>
                    <div class="knsdd-actions-wrapper">
                        <button type="button" class="knsdd-action-btn knsdd-messages-rule" title="${knsdd_data.i18n.configure_messages}">
                            <svg viewBox="0 0 24 24" width="16" height="16" fill="currentColor" aria-hidden="true"><path d="M2 4h20v12H6l-4 4V4zm4 4h12v2H6V8z"/></svg>
                        </button>
                        <button type="button" class="knsdd-action-btn knsdd-limits-rule knsdd-pro-feature-btn" title="${knsdd_data.i18n.usage_limits_pro || 'Kullanım Limitleri (Pro)'}" data-pro-feature="usage_limits" style="opacity: 0.6; cursor: pointer;">
                            <svg viewBox="0 0 24 24" width="16" height="16" fill="currentColor" aria-hidden="true"><path d="M3 13h4v8H3v-8zm7-6h4v14h-4V7zm7-4h4v18h-4V3z"/></svg>
                            <span class="knsdd-pro-badge-mini">PRO</span>
                        </button>
                        <button type="button" class="knsdd-action-btn knsdd-duplicate-rule" title="${knsdd_data.i18n.duplicate_rule}">
                            <svg viewBox="0 0 24 24" width="16" height="16" fill="currentColor" aria-hidden="true"><path d="M7 7h10v10H7V7zm-2 2H3v12h12v-2H5V9z"/></svg>
                        </button>
                        <button type="button" class="knsdd-action-btn knsdd-delete-rule" title="${knsdd_data.i18n.delete_rule}">
                            <svg viewBox="0 0 24 24" width="16" height="16" fill="currentColor" aria-hidden="true"><path d="M6 7h12v2H6V7zm1 3h10l-1 10H8L7 10zm3-5h4l1 1H9l1-1z"/></svg>
                        </button>
                    </div>
                </td>
            </tr>`;
        const $row = $(rowHtml);

        // Satırın verilerini jQuery .data() ile sakla
        const defaultMessageGroup = { text: '', color: '#000000', show: false };
        const defaultCartMessages = { ...defaultMessageGroup, show_mini: false, show_cart: false, show_checkout: false };

        const ruleData = {
            ...rule,
            messages: {
                product: { ...defaultMessageGroup, ...(rule.messages?.product || {}) },
                cart: { ...defaultCartMessages, ...(rule.messages?.cart || {}) },
                // BOGO mesajlarını koru
                ...(rule.messages?.product_trigger && { product_trigger: rule.messages.product_trigger }),
                ...(rule.messages?.product_target && { product_target: rule.messages.product_target })
            },
            first_order_only: initialFirstOrder,
            login_required: initialLoginRequired,
            login_required_manual: true // Her zaman true - kullanıcı kontrolünde
        };
        $row.data('ruleData', ruleData);

        // Select2 kütüphanelerini başlat
        const s2lang = {
            searching: () => knsdd_data.i18n.s2_searching,
            noResults: () => knsdd_data.i18n.s2_no_results,
            inputTooShort: args => knsdd_data.i18n.s2_min_input.replace('%d', args.minimum - args.input.length)
        };

        const $catSelect = $row.find('.knsdd-rule-category');
        $catSelect.select2({ language: s2lang, dropdownParent: $('body'), width: 'resolve', placeholder: '', allowClear: true });
        // Clear tooltip TR
        KNSDDSelect2.applyS2ClearLabel($catSelect);
        $catSelect.on('select2:open select2:close change', () => KNSDDSelect2.applyS2ClearLabel($catSelect));

        const ajaxSelect2Options = (action, categoryCallback) => ({
            language: s2lang,
            placeholder: knsdd_data.i18n.select_placeholder,
            closeOnSelect: false,
            minimumInputLength: 2,
            multiple: true,
            width: '100%',
            dropdownParent: $('body'),
            escapeMarkup: m => m,
            ajax: {
                url: knsdd_data.ajax_url,
                dataType: 'json',
                delay: 250,
                data: params => ({
                    action: action,
                    nonce: knsdd_data.nonce,
                    q: params.term,
                    category: categoryCallback ? categoryCallback() : undefined
                }),
                processResults: KNSDDSelect2.processProductResults,
                cache: false
            }
        });

        // Select2: Dropdown içinde arama kutusu kullanımı (cache'li adapter ile)
        const DropdownAdapter = KNSDDSelect2.getS2DropdownAdapter();

        const $productSelect = $row.find('.knsdd-rule-product');
        const $productWrapper = $row.find('.knsdd-product-select-wrapper');
        // KNSDD özel modu: inline aramayı gizleyip dropdown arama kutusu kullanacağız (yalnızca adaptör varsa)
        const productOptions = ajaxSelect2Options('knsdd_search_products', () => $row.find('.knsdd-rule-category').val());
        if (DropdownAdapter) {
            productOptions.dropdownAdapter = DropdownAdapter;
            $productWrapper.addClass('knsdd-dropdown-search-mode');
        }
        // Not: Dropdown için ekstra sınıf uygulanmıyor; kullanıcı isteğiyle dropdown varsayılan boşlukları korunur.
        // Ürün sonuç/çip şablonları
        productOptions.templateResult = KNSDDSelect2.formatProductOption;
        productOptions.templateSelection = KNSDDSelect2.formatProductSelection;
        $productSelect.select2(productOptions);
        KNSDDSelect2.attachSelect2SearchHandlers($productSelect);
        // Remove (x) butonlarına TR title/aria
        KNSDDSelect2.applyS2RemoveLabels($productSelect);
        $productSelect.on('select2:select select2:unselect change select2:open', () => KNSDDSelect2.applyS2RemoveLabels($productSelect));
        // Dropdown sınıfı enjekte edilmez (kullanıcı isteği)

        const $customerSelect = $row.find('.knsdd-customer-select');
        const $customerWrapper = $row.find('.knsdd-customer-select-wrapper');
        const customerOptions = ajaxSelect2Options('knsdd_search_customers');
        if (DropdownAdapter) {
            customerOptions.dropdownAdapter = DropdownAdapter;
            $customerWrapper.addClass('knsdd-dropdown-search-mode');
        }
        $customerSelect.select2(customerOptions);
        KNSDDSelect2.attachSelect2SearchHandlers($customerSelect);
        KNSDDSelect2.applyS2RemoveLabels($customerSelect);
        $customerSelect.on('select2:select select2:unselect change select2:open', () => KNSDDSelect2.applyS2RemoveLabels($customerSelect));

        // Müşteri seçildiğinde "Sadece Üyeler" kutusunu zorunlu yap
        const $loginRequiredCheckbox = $row.find('.knsdd-rule-login-required');
        const $firstOrderCheckbox = $row.find('.knsdd-rule-first-order');
        const updateLoginRequiredState = (isUserAction = false) => {
            const hasSelectedCustomers = (($customerSelect.val() || []).length > 0);
            const rd = $row.data('ruleData') || {};

            if (hasSelectedCustomers) {
                // Sadece belirli müşteriler seçiliyse zorunlu olarak üyelerle sınırlanır
                $loginRequiredCheckbox.prop('checked', true).prop('disabled', true);
                rd.login_required = true;
            } else {
                // Müşteri seçimi boşsa kilidi aç
                $loginRequiredCheckbox.prop('disabled', false);

                // Sadece kullanıcı etkileşimi ile müşteri silindiyse checkbox'ı false yap
                // İlk yüklemede veritabanından gelen değeri koru
                if (isUserAction) {
                    $loginRequiredCheckbox.prop('checked', false);
                    rd.login_required = false;
                } else {
                    rd.login_required = $loginRequiredCheckbox.is(':checked');
                }
            }
            $row.data('ruleData', rd);
        };
        // Kullanıcı manuel değiştirdiğinde ruleData ile senkronize et
        $row.on('change', '.knsdd-rule-login-required', function () {
            const rd = $row.data('ruleData') || {};
            rd.login_required = jQuery(this).is(':checked');
            rd.login_required_manual = true; // kullanıcı eliyle müdahale etti
            $row.data('ruleData', rd);
        });
        $customerSelect.on('change', () => updateLoginRequiredState(true));
        // Chip üzerindeki X ile silme veya select2 clear olaylarında da güncelle
        $customerSelect.on('select2:unselect select2:clear select2:select', () => updateLoginRequiredState(true));
        updateLoginRequiredState(false); // İlk yükleme - database değerini koru

        // --- Clear buttons bağlama ---
        const $clearProductsBtn = $row.find('.knsdd-clear-products');
        const $clearCustomersBtn = $row.find('.knsdd-clear-customers');
        const bindClear = ($btn, $select, afterClearCb) => {
            if (!$btn || !$btn.length || !$select || !$select.length) return;
            $btn.on('click', function (e) {
                e.preventDefault();
                if ($btn.is(':disabled')) return;
                $select.val(null).trigger('change');
                if (typeof afterClearCb === 'function') { try { afterClearCb(); } catch (_e) { } }
                KNSDDSelect2.setClearButtonState($btn, $select);
                if (!$select.is(':disabled')) {
                    $select.select2('open');
                    const $search = jQuery('.select2-container--open .select2-search__field');
                    $search.val('').trigger('focus');
                }
            });
            $select.on('change', function () { KNSDDSelect2.setClearButtonState($btn, $select); });
            // İlk durum
            KNSDDSelect2.setClearButtonState($btn, $select);
        };
        bindClear($clearProductsBtn, $productSelect, function () {
            // Tümünü sil butonuna basıldığında kategoriyi de temizle
            const cfg = (window.knsdd_data && knsdd_data.settings) ? knsdd_data.settings : {};
            if (cfg.auto_fill_category_from_products) {
                const $cat = $row.find('.knsdd-rule-category');
                if ($cat.val()) {
                    $cat.val(null).trigger('change');
                }
            }
        });
        bindClear($clearCustomersBtn, $customerSelect, () => updateLoginRequiredState(true));

        // İlk Sipariş değiştiğinde ruleData'yı güncelle
        $row.on('change', '.knsdd-rule-first-order', function () {
            const checked = jQuery(this).is(':checked');
            const rd = $row.data('ruleData') || {};
            rd.first_order_only = checked;
            $row.data('ruleData', rd);
        });

        // İlk durum: kilitleme sadece müşteri seçimi varsa uygulanır (updateLoginRequiredState zaten bunu yapar)

        // Kural tipine göre UI'ı ayarla
        updateRuleTypeUI($row);
        return $row;
    };

    /**
     * Seçilen gruba ait tüm kuralları tabloya çizer.
     * @param {string} group - Kuralları gösterilecek grup adı.
     * @param {jQuery} $rulesTbody - Kuralların ekleneceği <tbody> elementi.
     */
    const rules = (group, $rulesTbody) => {
        $rulesTbody.empty();
        if (!group) {
            // Grup seçili değilken tablo ve butonları gizle; bilgi mesajını göster
            $('#knsdd-rule-management').find('.knsdd-rules-container, #knsdd-rules-actions').hide();
            $('#knsdd-no-group-message').show();
            return;
        }
        // Grup seçiliyken bilgi mesajını gizle ve tablo+butonları göster
        $('#knsdd-no-group-message').hide();
        $('#knsdd-rule-management').find('.knsdd-rules-container, #knsdd-rules-actions').show();

        // Grup rule_type'ını al
        const groupRuleType = knsdd_data.group_rule_types && knsdd_data.group_rule_types[group];

        // Eğer hiç kural yoksa veya boş array ise boş bir satırla başla
        const rulesFromData = knsdd_data.data.rules[group];
        const rulesData = (rulesFromData && rulesFromData.length > 0) ? rulesFromData : [{}];

        rulesData.forEach(rule => {
            // Özel kampanya grubunda rule_type belirtilmemişse otomatik ata (ruleRow çağrılmadan önce)
            if (groupRuleType === 'special_campaign' && !rule.rule_type) {
                rule.rule_type = 'special_campaign';
            }
            // Sabit indirim grubunda rule_type belirtilmemişse otomatik ata
            if (groupRuleType === 'fixed_discount' && !rule.rule_type) {
                rule.rule_type = 'standard_discount';
            }
            $rulesTbody.append(ruleRow(rule));
        });

        // Grup değiştiğinde kısıtlamaları uygula
        if (groupRuleType) {
            applyGroupRuleTypeRestrictions(group);
        }
    };

    /**
     * Grup seçme <select> elementini mevcut gruplarla doldurur.
     * @param {string} selectedGroup - Başlangıçta seçili olacak grup.
     * @param {jQuery} $selectGroup - Doldurulacak <select> elementi.
     */
    const groupOptions = (selectedGroup, $selectGroup) => {
        $selectGroup.empty();
        if (!knsdd_data.groups || knsdd_data.groups.length === 0) {
            $selectGroup.append(`<option value="">${knsdd_data.i18n.no_group}</option>`);
            // Sadece tablo ve buton alanını gizle, bilgi mesajını gizleme
            $('#knsdd-rule-management').find('.knsdd-rules-container, #knsdd-rules-actions').hide();
            $('#knsdd-no-group-message').show();
            return;
        }
        // Not: Mesajı JS ile zorla gizleme; sunucu tarafı zaten gruplar varken gizli render eder.
        knsdd_data.groups.forEach(group => $selectGroup.append($('<option>', { value: group, text: group })));

        if (selectedGroup && knsdd_data.groups.includes(selectedGroup)) {
            $selectGroup.val(selectedGroup);
        } else {
            $selectGroup.val(knsdd_data.groups[0]);
        }
    };

    /**
     * Grup seçildiğinde UI kısıtlamalarını uygular
     * @param {string} groupName - Seçilen grup adı
     */
    const applyGroupRuleTypeRestrictions = (groupName) => {
        if (!groupName) return;

        const groupRuleType = knsdd_data.group_rule_types && knsdd_data.group_rule_types[groupName];
        if (!groupRuleType) return;

        // Tüm satırlardaki kural tipi gösterimini güncelle (artık dropdown yok, badge var)
        $('#knsdd-rules-tbody tr[data-rule-id]').each(function () {
            const $row = $(this);
            const ruleData = $row.data('ruleData') || {};

            // Grup tipine göre kural tipini ayarla
            if (groupRuleType === 'fixed_discount') {
                ruleData.rule_type = 'standard_discount';
            } else if (groupRuleType === 'special_campaign') {
                ruleData.rule_type = 'special_campaign';
            }

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

            // UI'yi güncelle
            updateRuleTypeUI($row);
        });

        // Kural Ekle ve Kuralları Kaydet butonlarını kontrol et
        const $addButton = $('#knsdd-add-rule');
        const $saveButton = $('#knsdd-save-rules');

        if (groupRuleType === 'special_campaign') {
            const ruleCount = $('#knsdd-rules-tbody tr[data-rule-id]').length;

            // Özel kampanyada her zaman boş satır gelir (render.rules içinde)
            // Buton görünürlüğü: 1+ kural varsa gizle
            if (ruleCount > 0) {
                $addButton.hide();
                $saveButton.show();
            }
            // NOT: ruleCount=0 durumu teorik olarak imkansız çünkü render.rules() boş satır ekliyor

            // Kopyala butonunu gizle (özel kampanyada tek kural olabilir)
            $('.knsdd-duplicate-rule').hide();
        } else {
            $addButton.show();
            // Kopyala butonunu göster ve aktif et
            $('.knsdd-duplicate-rule').show()
                .prop('disabled', false)
                .removeClass('knsdd-btn-disabled')
                .attr('title', knsdd_data.i18n.duplicate_rule || 'Kuralı Kopyala')
                .css({ 'opacity': '1', 'cursor': 'pointer' });

            // fixed_discount gruplari icin frontend kural limiti
            if (groupRuleType === 'fixed_discount') {
                const maxRules = knsdd_data.license.max_rules_per_group || 3;
                const currentRuleCount = $('#knsdd-rules-tbody tr[data-rule-id]').length;
                const $duplicateButtons = $('.knsdd-duplicate-rule');
                const limitMessage = (knsdd_data.i18n && knsdd_data.i18n.free_rules_limit_reached)
                    ? knsdd_data.i18n.free_rules_limit_reached
                    : '';

                if (currentRuleCount >= maxRules) {
                    // Limit aşıldı - butonu disable et ve upgrade mesajı göster
                    $addButton.prop('disabled', true)
                        .css({ 'opacity': '0.6', 'cursor': 'not-allowed' })
                        .attr('title', limitMessage);
                    $duplicateButtons.prop('disabled', true)
                        .addClass('knsdd-btn-disabled')
                        .css({ 'opacity': '0.6', 'cursor': 'not-allowed' })
                        .attr('title', limitMessage);

                    // Eğer limit mesajı yoksa ekle
                    if ($('#knsdd-rule-limit-notice').length === 0) {
                        const upgradeUrl = knsdd_data.license.upgrade_url || '#';
                        const upgradeLabel = (knsdd_data.i18n && knsdd_data.i18n.upgrade_to_pro_rocket)
                            ? knsdd_data.i18n.upgrade_to_pro_rocket
                            : '🚀 Pro Sürüme Geç';
                        const noticeHtml = `
                            <div id="knsdd-rule-limit-notice" class="notice notice-warning inline" style="margin: 10px 0; padding: 10px;">
                                <p>
                                    <strong>${limitMessage}</strong>
                                    <a href="${upgradeUrl}" class="button button-primary" style="margin-left: 10px;">${upgradeLabel}</a>
                                </p>
                            </div>`;
                        $('#knsdd-rules-actions').before(noticeHtml);
                    }
                } else {
                    // Limit altında - buton aktif
                    $addButton.prop('disabled', false)
                        .css({ 'opacity': '1', 'cursor': 'pointer' })
                        .removeAttr('title');
                    $duplicateButtons.prop('disabled', false)
                        .removeClass('knsdd-btn-disabled')
                        .css({ 'opacity': '1', 'cursor': 'pointer' })
                        .attr('title', knsdd_data.i18n.duplicate_rule || 'Kuralı Kopyala');

                    // Limit mesajını kaldır
                    $('#knsdd-rule-limit-notice').remove();
                }
            }
        }
    };

    // Buy X Get Y kampanya özeti için yardımcı fonksiyonlar
    // YENİ: Kategori + Ürün kombinasyonu desteği
    function getBuyXGetYScopeName(ruleData, prefix) {
        const products = ruleData[prefix + '_products'] || [];
        const catId = ruleData[prefix + '_category'] || 0;
        const hasProducts = products.length > 0;
        const hasCategory = catId > 0;

        // İkisi de yoksa
        if (!hasProducts && !hasCategory) {
            return '?';
        }

        // Sadece kategori
        if (!hasProducts && hasCategory) {
            const cached = window.knsddCategoryCache || {};
            return cached[catId] || (knsdd_data.i18n.category || 'Kategori') + ' #' + catId;
        }

        // Sadece ürün
        if (hasProducts && !hasCategory) {
            if (products.length === 1) {
                const cached = window.knsddProductCache || {};
                return cached[products[0]] || (knsdd_data.i18n.product_fallback_name || 'Ürün #%d').replace('%d', products[0]);
            }
            const first = window.knsddProductCache ? (window.knsddProductCache[products[0]] || products[0]) : products[0];
            return first + ' +' + (products.length - 1);
        }

        // Hem kategori hem ürün - Kombinasyon
        const catCached = window.knsddCategoryCache || {};
        const catName = catCached[catId] || ((knsdd_data.i18n.category || 'Kategori') + ' #' + catId);

        if (products.length === 1) {
            const prodCached = window.knsddProductCache || {};
            const prodName = prodCached[products[0]] || ('Ürün #' + products[0]);
            return catName + ' > ' + prodName;
        }
        return catName + ' > ' + products.length + ' ürün';
    }

    function getBuyXGetYDiscountText(ruleData) {
        const type = ruleData.discount_type || 'percentage';
        const value = (typeof ruleData.discount_value !== 'undefined' && ruleData.discount_value !== null)
            ? ruleData.discount_value
            : 0;
        const currency = knsdd_data.i18n.currency || '₺';

        if (type === 'free') {
            return knsdd_data.i18n.free || 'Bedava';
        } else if (type === 'percentage') {
            return '%' + value;
        } else if (type === 'amount') {
            return value + ' ' + currency;
        }
        return '?';
    }

    /**
     * Public wrapper: Kural limit durumunu güncelle
     */
    const updateRuleLimitStatus = () => {
        const currentGroup = $('#knsdd-select-group').val();
        if (currentGroup) {
            applyGroupRuleTypeRestrictions(currentGroup);
        }
    };

    // Dışarıya açılacak fonksiyonlar
    return {
        ruleRow: ruleRow,
        rules: rules,
        groupOptions: groupOptions,
        updateRuleTypeUI: updateRuleTypeUI,
        applyGroupRuleTypeRestrictions: applyGroupRuleTypeRestrictions,
        updateRuleLimitStatus: updateRuleLimitStatus
    };

})(jQuery);

// Global erişim için window'a ekle
window.updateRuleLimitStatus = KNSDDRules.render.updateRuleLimitStatus;
