/**
 * KNSDD Grup Yönetimi - Olay (Event) Yönetim Modülü
 *
 * Sayfadaki tüm kullanıcı etkileşimlerini dinler ve diğer modülleri
 * organize ederek uygulamanın ana mantığını yürütür.
 */
jQuery(document).ready(function ($) {
    'use strict';

    // Sadece grup yönetimi sayfasındaysak bu kodları çalıştır.
    if (typeof knsdd_data === 'undefined' || knsdd_data.page !== 'groups') {
        return;
    }

    // Gerekli modülleri global isim alanından al
    const State = KNSDDGroups.state;
    const Data = KNSDDGroups.data;
    const Render = KNSDDGroups.render;
    const Modal = KNSDDGroups.modal;
    // Ayarlar (varsayılanlarla)
    const S = Object.assign({
        conflict_action: 'revert',
        inline_warning_ms: 5000,
        conflict_scope: 'same_rules',
        warning_theme: 'rose',
        warning_location: 'inplace',
        focus_theme: 'amber',
        last_highlight_ms: 3500,
        trigger_timing: 'realtime',
        a11y_alert_role: 1,
    }, (knsdd_data && knsdd_data.settings) ? knsdd_data.settings : {});

    /**
     * Bildirim göster (admin-common.js'den global fonksiyon)
     */
    const showNotice = window.showNotice || function (type, message) {
        console.error('showNotice not available:', type, message);
        alert(message);
    };

    /**
     * AJAX isteği gönderir
     * @param {string} action - AJAX action adı (knsdd_ prefix'i otomatik eklenir)
     * @param {object} data - Gönderilecek veri
     * @param {function} successCallback - Başarı callback'i
     * @param {function} errorCallback - Hata callback'i (opsiyonel)
     */
    const ajaxRequest = (action, data, successCallback, errorCallback) => {
        $.post(knsdd_data.ajax_url, {
            action: 'knsdd_' + action,
            nonce: knsdd_data.nonce,
            ...data
        })
            .done(function (response) {
                if (response.success) {
                    if (successCallback) successCallback(response.data);
                } else {
                    const errorMsg = response.data && response.data.message ? response.data.message : (knsdd_data.i18n.unknown_error || 'An unknown error occurred.');
                    if (errorCallback) {
                        errorCallback(response.data);
                    } else {
                        showNotice('error', errorMsg);
                    }
                }
            })
            .fail(function () {
                const msg = knsdd_data.i18n.network_error || 'Sunucu ile iletişim kurulamadı.';
                if (errorCallback) {
                    errorCallback({ message: msg });
                } else {
                    showNotice('error', msg);
                }
            });
    };

    /**
     * Belirtilen input/select öğesindeki metnin mevcut genişliğe sığması için
     * font-size'ı otomatik küçültür. Minimum 11px'e kadar iner.
     */
    const autoFitControl = (el) => {
        if (!el) return;
        const $el = $(el);
        const isSelect = el.tagName === 'SELECT';

        // Cache the element's baseline (max) font size on first run so it can grow back later
        let baseline = $el.data('knsddBaselineFont');
        if (!baseline) {
            baseline = parseFloat(window.getComputedStyle(el).fontSize) || 13;
            $el.data('knsddBaselineFont', baseline);
        }
        const maxSize = baseline; // always try to grow back up to baseline
        const minSize = 11;

        let $mirror = $el.data('knsddMirror');
        if (!$mirror || !$mirror.length) {
            $mirror = $('<span/>').css({
                position: 'absolute',
                visibility: 'hidden',
                whiteSpace: 'nowrap',
                pointerEvents: 'none',
                left: '-9999px',
                top: '-9999px'
            }).appendTo(document.body);
            $el.data('knsddMirror', $mirror);
        }

        const applyMirrorStyles = () => {
            const cs = window.getComputedStyle(el);
            $mirror.css({
                fontFamily: cs.fontFamily,
                fontWeight: cs.fontWeight,
                fontStyle: cs.fontStyle,
                letterSpacing: cs.letterSpacing,
                textTransform: cs.textTransform,
                padding: 0,
                border: 0
            });
        };

        const getText = () => {
            if (isSelect) {
                const opt = el.options[el.selectedIndex];
                return opt ? opt.text : '';
            }
            // Özel durum filtresi butonu için
            if (el.id === 'knsdd-status-filter-toggle') {
                const $textSpan = $el.find('.knsdd-status-filter-text');
                return $textSpan.length ? $textSpan.text() : '';
            }
            return $el.val() || el.placeholder || '';
        };

        const containerWidth = () => {
            const cs = window.getComputedStyle(el);
            const padL = parseFloat(cs.paddingLeft) || 0;
            const padR = parseFloat(cs.paddingRight) || 0;
            return el.clientWidth - padL - padR - 2;
        };

        const textFits = (sizePx) => {
            $mirror.css('fontSize', sizePx + 'px').text(getText());
            return $mirror.outerWidth() <= containerWidth();
        };

        applyMirrorStyles();

        // If empty text, reset to baseline and exit
        if (!getText()) {
            $el.css('fontSize', maxSize + 'px');
            return;
        }

        // First try baseline size to allow growth
        if (textFits(maxSize)) {
            $el.css('fontSize', maxSize + 'px');
            return;
        }

        // Binary search downward to find largest size that fits
        let lo = minSize, hi = maxSize, best = minSize;
        while (lo <= hi) {
            const mid = Math.floor((lo + hi) / 2);
            if (textFits(mid)) { best = mid; lo = mid + 1; } else { hi = mid - 1; }
        }
        $el.css('fontSize', best + 'px');
    };

    /**
     * BOGO gruplar arası çakışma kontrolü
     */
    const checkBOGOCrossGroupConflict = (myRules, start, end, currentGroup) => {
        // BOGO kampanyalarını filtrele
        const myBogoRules = myRules.filter(r =>
            r.rule_type === 'special_campaign' &&
            r.campaign_type === 'buy_x_get_y_discount'
        );

        if (myBogoRules.length === 0) {
            return { conflict: false };
        }

        // Tetikleyici ürün ve kategorileri topla
        const myTriggerProducts = [];
        const myTriggerCategories = [];

        myBogoRules.forEach(r => {
            if (r.trigger_products && Array.isArray(r.trigger_products)) {
                myTriggerProducts.push(...r.trigger_products.map(p => parseInt(p)));
            }
            if (r.trigger_category) {
                myTriggerCategories.push(parseInt(r.trigger_category));
            }
        });

        if (myTriggerProducts.length === 0 && myTriggerCategories.length === 0) {
            return { conflict: false };
        }

        const parseYMD = (s) => {
            if (!s) return null;
            const [y, m, d] = String(s).split('-').map(Number);
            return (y && m && d) ? new Date(y, m - 1, d) : null;
        };

        const rangesOverlap = (aS, aE, bS, bE) => {
            if (!aS || !aE || !bS || !bE) return false;
            const aStart = parseYMD(aS), aEnd = parseYMD(aE), bStart = parseYMD(bS), bEnd = parseYMD(bE);
            if (!aStart || !aEnd || !bStart || !bEnd) return false;
            aStart.setHours(0, 0, 0, 0); aEnd.setHours(0, 0, 0, 0); bStart.setHours(0, 0, 0, 0); bEnd.setHours(0, 0, 0, 0);
            return aStart <= bEnd && bStart <= aEnd;
        };

        // Diğer grupları kontrol et
        for (const otherGroup of (knsdd_data.groups || [])) {
            if (otherGroup === currentGroup) continue;

            const otherDates = (knsdd_data.data.dates && knsdd_data.data.dates[otherGroup]) || { start: '', end: '' };
            if (!rangesOverlap(start, end, otherDates.start, otherDates.end)) continue;

            const otherRules = (knsdd_data.data.rules && knsdd_data.data.rules[otherGroup]) || [];
            const otherBogoRules = otherRules.filter(r =>
                r.rule_type === 'special_campaign' &&
                r.campaign_type === 'buy_x_get_y_discount'
            );

            if (otherBogoRules.length === 0) continue;

            // Diğer grubun tetikleyicilerini topla
            const otherTriggerProducts = [];
            const otherTriggerCategories = [];

            otherBogoRules.forEach(r => {
                if (r.trigger_products && Array.isArray(r.trigger_products)) {
                    otherTriggerProducts.push(...r.trigger_products.map(p => parseInt(p)));
                }
                if (r.trigger_category) {
                    otherTriggerCategories.push(parseInt(r.trigger_category));
                }
            });

            // Ürün çakışması kontrolü
            if (myTriggerProducts.length > 0 && otherTriggerProducts.length > 0) {
                const productOverlap = myTriggerProducts.some(p => otherTriggerProducts.includes(p));
                if (productOverlap) {
                    return { conflict: true, with: otherGroup, dates: otherDates };
                }
            }

            // Kategori çakışması kontrolü
            if (myTriggerCategories.length > 0 && otherTriggerCategories.length > 0) {
                const categoryOverlap = myTriggerCategories.some(c => otherTriggerCategories.includes(c));
                if (categoryOverlap) {
                    return { conflict: true, with: otherGroup, dates: otherDates };
                }
            }
        }

        return { conflict: false };
    };

    /**
     * Sayfayı ve tüm etkileşimleri başlatan ana fonksiyon.
     */
    const init = () => {
        // Focus highlight color: bind CSS var to selected focus theme (fallback amber)
        try {
            const themeToBg = {
                rose: '#fde8e8',
                blue: '#e8f1fd',
                gray: '#f4f6f8',
                sage: '#e9f5f0',
                lavender: '#efe9f9',
                amber: '#fff7d6'
            };
            // Dark accent (used for 1px outline) – matches text tone of each theme
            const themeToBd = {
                rose: '#7a1f1f',
                blue: '#123e7a',
                gray: '#2f3947',
                sage: '#1e5b48',
                lavender: '#3f2a77',
                amber: '#7a4a0b'
            };
            // Subtle glow color (2px) with low opacity
            const themeToGlow = {
                rose: 'rgba(122, 31, 31, 0.08)',
                blue: 'rgba(18, 62, 122, 0.08)',
                gray: 'rgba(47, 57, 71, 0.08)',
                sage: 'rgba(30, 91, 72, 0.08)',
                lavender: 'rgba(63, 42, 119, 0.08)',
                amber: 'rgba(122, 74, 11, 0.08)'
            };
            const ft = (S && S.focus_theme) ? String(S.focus_theme) : 'amber';
            const bg = themeToBg[ft] || themeToBg['amber'];
            const bd = themeToBd[ft] || themeToBd['amber'];
            const glow = themeToGlow[ft] || themeToGlow['amber'];
            const root = document.documentElement;
            root.style.setProperty('--knsdd-highlight-bg', bg);
            root.style.setProperty('--knsdd-highlight-bd', bd);
            root.style.setProperty('--knsdd-highlight-glow', glow);
        } catch (_e) { /* no-op */ }

        // Çevirileri ve UI metinlerini ayarla
        Render.initFilterI18n();

        // Kayıtlı filtreleri yükle ve UI'a uygula
        const currentFilters = State.load();
        Render.applyFiltersToUI(currentFilters);
        updateStatusFilterDisplay(currentFilters.statusFilter);

        // Filtre kontrollerini ilk durumda sığdır
        setTimeout(() => {
            autoFitControl(document.getElementById('knsdd-group-search'));
            autoFitControl(document.getElementById('knsdd-status-filter-toggle'));
            autoFitControl(document.getElementById('knsdd-group-sort'));
            autoFitControl(document.getElementById('knsdd-advanced-filter'));
        }, 0);

        // Tabloyu ilk kez çiz
        refreshTable();

        // Geri dönüşte lastGroup varsa ilgili satıra odaklan ve vurgula
        applyLastGroupFocus();

        // Olay dinleyicilerini bağla
        bindEvents();

        // Modal'ı başlat
        Modal.init((data) => {
            // Modal'da kaydetme başarılı olursa, global veriyi güncelle ve tabloyu yenile
            knsdd_data.groups = data.groups;
            // Diğer veri yapılarını da güncellemek gerekebilir, en temizi tabloyu yenilemek.
            refreshTable();
        });
    };

    /**
     * localStorage.lastGroup varsa uygun satıra scroll + geçici highlight uygular, sonra siler.
     */
    const applyLastGroupFocus = () => {
        try {
            const last = window.localStorage ? localStorage.getItem('lastGroup') : null;
            if (!last) return;
            const $row = $('#knsdd-toggle-tbody').find('tr').filter(function () {
                return $(this).data('group') === last;
            });
            if ($row.length) {
                // Satırı merkeze kaydır
                const el = $row.get(0);
                if (el && el.scrollIntoView) {
                    el.scrollIntoView({ behavior: 'smooth', block: 'center' });
                } else {
                    // Fallback: pencere scroll'unu ortala
                    const rect = el.getBoundingClientRect();
                    const targetTop = window.pageYOffset + rect.top - (window.innerHeight / 2) + (rect.height / 2);
                    window.scrollTo({ top: Math.max(targetTop, 0), behavior: 'smooth' });
                }

                // Amber vurgu (CSS sınıfı ile)
                const highlightMs = Number(S.last_highlight_ms || 3500);
                $row.addClass('knsdd-return-focus');
                setTimeout(() => {
                    $row.removeClass('knsdd-return-focus');
                }, highlightMs);
            }
            // Temizle
            if (window.localStorage) localStorage.removeItem('lastGroup');
        } catch (e) {
            // yoksay
        }
    };

    /**
     * Durum filtresi buton metnini günceller.
     */
    const updateStatusFilterDisplay = (selectedStatuses) => {
        const i18n = knsdd_data.i18n || {};
        const $button = $('#knsdd-status-filter-toggle .knsdd-status-filter-text');

        if (!selectedStatuses || selectedStatuses.length === 0) {
            $button.text(i18n.status_all || 'Tüm Durumlar');
        } else if (selectedStatuses.length === 1) {
            const statusMap = {
                'open': i18n.status_open || 'Aktif',
                'closed-pending': i18n.status_pending || 'Beklemede',
                'closed-expired': i18n.status_expired || 'Tamamlandı',
                'paused': i18n.manual_paused || 'Manuel Pasif',
                'closed-incomplete': i18n.status_incomplete || 'Tarih Belirtilmedi'
            };
            $button.text(statusMap[selectedStatuses[0]] || selectedStatuses[0]);
        } else {
            $button.text(i18n.label_status || 'Durum');
        }

        // Metni sığdır
        autoFitControl(document.getElementById('knsdd-status-filter-toggle'));
    };

    /**
     * Tabloyu mevcut filtrelere göre yeniden çizer.
     */
    const refreshTable = () => {
        const currentFilters = State.load();
        const processedGroups = Data.process(knsdd_data.groups, currentFilters);
        Render.table(processedGroups);
    };

    /**
     * Tüm olay dinleyicilerini (event listeners) tanımlar.
     */
    const handleDateChange = function () {
        const $row = $(this).closest('tr');
        const group = $row.data('group');

        // Disabled input'larda val() formatlanmış değer döner, data-iso kullanmalıyız
        const $startInput = $row.find('.knsdd-start-date');
        const $endInput = $row.find('.knsdd-end-date');
        const start = $startInput.prop('disabled') ? $startInput.data('iso') : $startInput.val();
        const end = $endInput.prop('disabled') ? $endInput.data('iso') : $endInput.val();
        // --- KOPYA GRUP KONTROLÜ: Tarih çakışması + aynı kural seti ---
        const parseYMD = (s) => { if (!s) return null; const [y, m, d] = String(s).split('-').map(Number); return (y && m && d) ? new Date(y, m - 1, d) : null; };
        const rangesOverlap = (aS, aE, bS, bE) => {
            if (!aS || !aE || !bS || !bE) return false; // tarihsizler serbest
            const aStart = parseYMD(aS), aEnd = parseYMD(aE), bStart = parseYMD(bS), bEnd = parseYMD(bE);
            if (!aStart || !aEnd || !bStart || !bEnd) return false;
            aStart.setHours(0, 0, 0, 0); aEnd.setHours(0, 0, 0, 0); bStart.setHours(0, 0, 0, 0); bEnd.setHours(0, 0, 0, 0);
            return aStart <= bEnd && bStart <= aEnd;
        };
        const buildRuleObjectSignature = (rule = {}) => {
            const category = rule.category || '';
            const productValues = (rule.product || []).slice().sort();
            const min = String(rule.min || 0);
            const max = String(rule.max || 0);
            const loginRequired = rule.login_required ? '1' : '0';
            const allowedCustomers = (rule.allowed_customers || []).slice().sort();
            const ruleType = rule.rule_type || 'standard_discount';
            const base = { category, product: productValues, min, max, loginRequired, allowedCustomers, ruleType };
            if (ruleType === 'special_campaign') {
                base.campaignType = rule.campaign_type || '';
                base.buyX = String(rule.buy_x || '');
                base.payY = String(rule.pay_y || '');
                base.nth = String(rule.nth || '');
                base.percent = String(rule.percent || '');
                base.min_cart_total = String(rule.min_cart_total || '');
                base.discount_type_ct = String(rule.discount_type || '');
                base.discount_value_ct = String(rule.discount_value || '');
            } else {
                base.discountType = rule.discount_type || 'percent';
                base.discountValue = String(rule.discount_value || 0);
            }
            return JSON.stringify(base);
        };
        const areRuleSetsEqual = (rulesA = [], rulesB = []) => {
            if (!Array.isArray(rulesA) || !Array.isArray(rulesB)) return false;
            // Empty rule sets should not be considered as conflicting
            if (rulesA.length === 0 || rulesB.length === 0) return false;
            if (rulesA.length !== rulesB.length) return false;
            const map = new Map();
            rulesA.forEach(r => { const s = buildRuleObjectSignature(r); map.set(s, (map.get(s) || 0) + 1); });
            for (const r of rulesB) { const s = buildRuleObjectSignature(r); const c = map.get(s) || 0; if (c === 0) return false; map.set(s, c - 1); }
            for (const v of map.values()) { if (v !== 0) return false; }
            return true;
        };
        const setInputsToDates = (sOld, eOld) => {
            const sPicker = $row.find('.knsdd-start-date')[0]._flatpickr;
            const ePicker = $row.find('.knsdd-end-date')[0]._flatpickr;
            if (sPicker) sPicker.setDate(sOld || null, false);
            if (ePicker) ePicker.setDate(eOld || null, false);
        };

        let conflictWith = null;
        let conflictDates = null; // Çakışan grubun tarihleri
        let conflictType = null; // 'same_rules' veya 'bogo'
        const myRules = (knsdd_data.data.rules && knsdd_data.data.rules[group]) || [];
        // Eski kayıtlı tarihler (revert için)
        const oldDates = (knsdd_data.data.dates && knsdd_data.data.dates[group]) || { start: '', end: '' };

        // 1) Aynı kural seti kontrolü (mevcut)
        for (const other of (knsdd_data.groups || [])) {
            if (other === group) continue;
            const od = (knsdd_data.data.dates && knsdd_data.data.dates[other]) || { start: '', end: '' };
            if (!rangesOverlap(start, end, od.start, od.end)) continue;
            const otherRules = (knsdd_data.data.rules && knsdd_data.data.rules[other]) || [];
            if (areRuleSetsEqual(myRules, otherRules)) {
                conflictWith = other;
                conflictDates = od;
                conflictType = 'same_rules';
                break;
            }
        }

        // 2) BOGO çakışma kontrolü (yeni)
        if (!conflictWith) {
            const bogoConflict = checkBOGOCrossGroupConflict(myRules, start, end, group);
            if (bogoConflict.conflict) {
                conflictWith = bogoConflict.with;
                conflictDates = bogoConflict.dates;
                conflictType = 'bogo';
            }
        }
        if (conflictWith) {
            // Görsel vurgu: çakışan satırı vurgula
            const $conflictRow = $row; // mevcut düzenlenen satır
            $conflictRow.addClass('knsdd-row-conflict knsdd-row-conflict-start knsdd-row-conflict-end');

            // Çakışma sonrası: ayar bazlı davranış
            if (S.conflict_action === 'clear') {
                setInputsToDates(null, null);
            } else {
                setInputsToDates(oldDates.start, oldDates.end);
            }

            // Mesaj içerik: çakışma türüne göre
            const i18n = (typeof knsdd_data !== 'undefined' && knsdd_data.i18n) ? knsdd_data.i18n : {};
            let msg;

            if (conflictType === 'bogo') {
                const bogoTpl = i18n.bogo_cross_group_conflict || "BOGO çakışması: '%s' grubuyla aynı tetikleyici ürün/kategori kullanılıyor. Aynı tarihlerde aynı tetikleyici farklı gruplarda kullanılamaz.";
                msg = bogoTpl.replace('%s', conflictWith);
            } else {
                // Aynı kural seti çakışması
                const aS = parseYMD(start), aE = parseYMD(end);
                const bS = parseYMD(conflictDates && conflictDates.start), bE = parseYMD(conflictDates && conflictDates.end);
                const isEqualRange = !!(aS && aE && bS && bE && aS.getTime() === bS.getTime() && aE.getTime() === bE.getTime());
                const equalTpl = i18n.duplicate_group_dates_equal || "Bu tarih aralığı, '%s' grubuyla birebir aynı tarih aralığı içermektedir. Aynı kural setleri için tamamen aynı tarih aralığına izin verilmez.";
                const overlapTpl = i18n.duplicate_group_dates_overlap || "Bu tarih aralığı, '%s' grubuyla aynı tarih aralığı içermektedir. Aynı kural setleri için tarih aralıklarının örtüşmesine izin verilmez.";
                msg = (isEqualRange ? equalTpl : overlapTpl).replace('%s', conflictWith);
            }

            const duration = Number(S.inline_warning_ms || 5000);
            // Yeni anahtar: 'top_notice'. Eski kurulumlarda 'toast' gelebilir, ikisini de tepe bildirimi olarak kabul et.
            if (S.warning_location === 'top_notice' || S.warning_location === 'toast') {
                // Global notice olarak göster
                showNotice('error', msg);
                setTimeout(() => {
                    $conflictRow.removeClass('knsdd-row-conflict knsdd-row-conflict-start knsdd-row-conflict-end');
                }, duration);
            } else {
                // Satır altı inline uyarı
                let $inline = $conflictRow.next('.knsdd-inline-error-row');
                if (!$inline.length) {
                    const a11y = Number(S.a11y_alert_role || 0) === 1;
                    const roleAttrs = a11y ? ' role="alert" aria-live="polite"' : '';
                    $inline = $('<tr class="knsdd-inline-error-row"><td colspan="6" class="knsdd-inline-warning knsdd-theme-' + S.warning_theme + '"' + roleAttrs + '></td></tr>');
                    $conflictRow.after($inline);
                }
                $inline.find('td').text(msg);

                // Timer
                const prevTimer = $conflictRow.data('inlineErrorTimer');
                if (prevTimer) { clearTimeout(prevTimer); }
                const newTimer = setTimeout(() => {
                    $conflictRow.removeClass('knsdd-row-conflict knsdd-row-conflict-start knsdd-row-conflict-end');
                    $inline.remove();
                    $conflictRow.removeData('inlineErrorTimer');
                }, duration);
                $conflictRow.data('inlineErrorTimer', newTimer);
            }

            return; // AJAX yapma
        }
        ajaxRequest('save_group_dates', { group, start, end }, (data) => {
            knsdd_data.data.dates[group] = { start, end };
            knsdd_data.data.statuses[group] = data.status_info;
            const wasPaused = !!(knsdd_data.data.paused && knsdd_data.data.paused[group]);
            const isOpenOrPausedBadge = !!(data.status_info && (data.status_info.status === 'open' || data.status_info.className === 'status-paused'));
            const today = new Date(); today.setHours(0, 0, 0, 0);
            const parseYMD = (s) => { const [y, m, d] = (s || '').split('-').map(Number); return (y && m && d) ? new Date(y, m - 1, d) : null; };
            const sDate = parseYMD(start); const eDate = parseYMD(end);
            const coversToday = !!(sDate && eDate && today >= sDate && today <= eDate);

            // Clear read notifications for this group when dates change
            try {
                if (window.sessionStorage) {
                    const readNotifications = JSON.parse(sessionStorage.getItem('knsdd_read_notifications') || '[]');
                    const groupKey = group.toLowerCase().replace(/[^a-z0-9]/g, '');
                    // Remove all notifications that contain this group name in their ID
                    const filteredNotifications = readNotifications.filter(id => {
                        const idLower = id.toLowerCase();
                        return !idLower.includes(groupKey);
                    });
                    if (filteredNotifications.length !== readNotifications.length) {
                        sessionStorage.setItem('knsdd_read_notifications', JSON.stringify(filteredNotifications));
                    }
                }
            } catch (e) { }

            // Refresh notification panel after a short delay to ensure cache is cleared
            if (typeof window.KNSDDNotificationPanel !== 'undefined' && window.KNSDDNotificationPanel) {
                setTimeout(function () {
                    window.KNSDDNotificationPanel.refreshNotifications();
                }, 100);
            }

            if ((isOpenOrPausedBadge || coversToday) && wasPaused) {
                ajaxRequest('toggle_group_paused', { group, paused: 0 }, (resp) => {
                    if (!knsdd_data.data.paused) knsdd_data.data.paused = {};
                    knsdd_data.data.paused[group] = false;
                    if (resp.status_info) {
                        knsdd_data.data.statuses[group] = resp.status_info;
                    }
                    refreshTable();
                    showNotice('success', data.message);
                });
            } else {
                refreshTable();
                showNotice('success', data.message);
            }
        }, (err) => {
            // Sunucu hatasını inline (satır altı) veya üst bildirimde göster.
            const $conflictRow = $row;
            const duration = Number(S.inline_warning_ms || 5000);
            const msg = (err && err.message) || (knsdd_data.i18n && knsdd_data.i18n.unknown_error) || 'An unknown server error occurred.';

            // Özel durum: Gruplar arası kapsam çakışması. Bu durumda satıra kırmızı çerçeve eklemeyelim.
            const isCrossGroupScope = !!(err && err.code === 'cross_group_scope_conflict');

            if (S.warning_location === 'top_notice' || S.warning_location === 'toast') {
                showNotice('error', msg);
                return;
            }

            // Inline gösterim: isCrossGroupScope ise sadece mesaj satırı ekle, highlight yok.
            if (!isCrossGroupScope) {
                $conflictRow.addClass('knsdd-row-conflict knsdd-row-conflict-start knsdd-row-conflict-end');
            }

            let $inline = $conflictRow.next('.knsdd-inline-error-row');
            if (!$inline.length) {
                const a11y = Number(S.a11y_alert_role || 0) === 1;
                const roleAttrs = a11y ? ' role="alert" aria-live="polite"' : '';
                $inline = $('<tr class="knsdd-inline-error-row"><td colspan="6" class="knsdd-inline-warning knsdd-theme-' + S.warning_theme + '"' + roleAttrs + '></td></tr>');
                $conflictRow.after($inline);
            }
            $inline.find('td').text(msg);

            const prevTimer = $conflictRow.data('inlineErrorTimer');
            if (prevTimer) { clearTimeout(prevTimer); }
            const newTimer = setTimeout(() => {
                if (!isCrossGroupScope) {
                    $conflictRow.removeClass('knsdd-row-conflict knsdd-row-conflict-start knsdd-row-conflict-end');
                }
                $inline.remove();
                $conflictRow.removeData('inlineErrorTimer');
            }, duration);
            $conflictRow.data('inlineErrorTimer', newTimer);
        });
    };

    const bindEvents = () => {
        // Durum filtresi dropdown toggle
        $('#knsdd-status-filter-toggle').on('click', function (e) {
            e.stopPropagation();
            const $dropdown = $('#knsdd-status-filter-dropdown');
            const isOpen = $(this).attr('aria-expanded') === 'true';

            if (isOpen) {
                $(this).attr('aria-expanded', 'false');
                $dropdown.hide();
            } else {
                $(this).attr('aria-expanded', 'true');
                $dropdown.show();
            }
        });

        // Dropdown dışına tıklanınca kapat
        $(document).on('click', function (e) {
            if (!$(e.target).closest('.knsdd-status-filter-wrapper').length) {
                $('#knsdd-status-filter-toggle').attr('aria-expanded', 'false');
                $('#knsdd-status-filter-dropdown').hide();
            }
        });

        // "Tüm Durumlar" seçeneği
        $('.knsdd-status-filter-option[data-value="all"]').on('click', function () {
            $('.knsdd-status-filter-checkbox-item input[type="checkbox"]').prop('checked', false);
            $('.knsdd-status-filter-checkbox-item').attr('aria-checked', 'false');
            updateStatusFilterDisplay([]);
            const currentFilters = State.load();
            const newFilters = {
                searchTerm: $('#knsdd-group-search').val(),
                statusFilter: [],
                sortOption: $('#knsdd-group-sort').val(),
                advancedFilter: $('#knsdd-advanced-filter').val(),
                currentPage: 1,
                perPage: currentFilters.perPage
            };
            State.save(newFilters);
            refreshTable();
            $('#knsdd-status-filter-toggle').attr('aria-expanded', 'false');
            $('#knsdd-status-filter-dropdown').hide();
        });

        // "Seçimi Temizle" seçeneği
        $('.knsdd-status-filter-option[data-value="clear"]').on('click', function () {
            $('.knsdd-status-filter-checkbox-item input[type="checkbox"]').prop('checked', false);
            $('.knsdd-status-filter-checkbox-item').attr('aria-checked', 'false');
            updateStatusFilterDisplay([]);
            const currentFilters = State.load();
            const newFilters = {
                searchTerm: $('#knsdd-group-search').val(),
                statusFilter: [],
                sortOption: $('#knsdd-group-sort').val(),
                advancedFilter: $('#knsdd-advanced-filter').val(),
                currentPage: 1,
                perPage: currentFilters.perPage
            };
            State.save(newFilters);
            refreshTable();
        });

        // Checkbox seçenekleri
        $('.knsdd-status-filter-checkbox-item').on('click', function (e) {
            if (e.target.tagName !== 'INPUT') {
                const $checkbox = $(this).find('input[type="checkbox"]');
                $checkbox.prop('checked', !$checkbox.prop('checked')).trigger('change');
            }
        });

        $('.knsdd-status-filter-checkbox-item input[type="checkbox"]').on('change', function (e) {
            e.stopPropagation();
            const $parent = $(this).closest('.knsdd-status-filter-checkbox-item');
            $parent.attr('aria-checked', this.checked ? 'true' : 'false');

            const selectedStatuses = [];
            $('.knsdd-status-filter-checkbox-item input[type="checkbox"]:checked').each(function () {
                selectedStatuses.push($(this).val());
            });

            updateStatusFilterDisplay(selectedStatuses);

            const currentFilters = State.load();
            const newFilters = {
                searchTerm: $('#knsdd-group-search').val(),
                statusFilter: selectedStatuses,
                sortOption: $('#knsdd-group-sort').val(),
                advancedFilter: $('#knsdd-advanced-filter').val(),
                currentPage: 1,
                perPage: currentFilters.perPage
            };
            State.save(newFilters);
            refreshTable();
        });

        // Filtreleme alanlarındaki değişiklikleri dinle
        let searchDebounceTimer = null;

        // Arama için debounce (300ms)
        $('#knsdd-group-search').on('input', (e) => {
            clearTimeout(searchDebounceTimer);
            searchDebounceTimer = setTimeout(() => {
                const currentFilters = State.load();
                const newFilters = {
                    searchTerm: $('#knsdd-group-search').val(),
                    statusFilter: currentFilters.statusFilter,
                    sortOption: $('#knsdd-group-sort').val(),
                    advancedFilter: $('#knsdd-advanced-filter').val(),
                    currentPage: 1,
                    perPage: currentFilters.perPage
                };
                State.save(newFilters);
                refreshTable();
                autoFitControl(e.target);
            }, 300);
        });

        // Select'ler için anında (debounce yok)
        $('#knsdd-group-sort, #knsdd-advanced-filter').on('change', (e) => {
            const currentFilters = State.load();
            const newFilters = {
                searchTerm: $('#knsdd-group-search').val(),
                statusFilter: currentFilters.statusFilter,
                sortOption: $('#knsdd-group-sort').val(),
                advancedFilter: $('#knsdd-advanced-filter').val(),
                currentPage: 1,
                perPage: currentFilters.perPage
            };
            State.save(newFilters);
            refreshTable();
            autoFitControl(e.target);
        });

        // Sayfalama butonları
        $('#knsdd-pagination-first').on('click', () => {
            const currentFilters = State.load();
            currentFilters.currentPage = 1;
            State.save(currentFilters);
            refreshTable();
        });

        $('#knsdd-pagination-prev').on('click', () => {
            const currentFilters = State.load();
            if (currentFilters.currentPage > 1) {
                currentFilters.currentPage--;
                State.save(currentFilters);
                refreshTable();
            }
        });

        $('#knsdd-pagination-next').on('click', () => {
            const currentFilters = State.load();
            const result = Data.process(knsdd_data.groups, currentFilters);
            if (currentFilters.currentPage < result.totalPages) {
                currentFilters.currentPage++;
                State.save(currentFilters);
                refreshTable();
            }
        });

        $('#knsdd-pagination-last').on('click', () => {
            const currentFilters = State.load();
            const result = Data.process(knsdd_data.groups, currentFilters);
            currentFilters.currentPage = result.totalPages;
            State.save(currentFilters);
            refreshTable();
        });

        // Pencere yeniden boyutlanınca yeniden sığdır
        let resizeTimer = null;
        $(window).on('resize', () => {
            if (resizeTimer) cancelAnimationFrame(resizeTimer);
            resizeTimer = requestAnimationFrame(() => {
                autoFitControl(document.getElementById('knsdd-group-search'));
                autoFitControl(document.getElementById('knsdd-status-filter-toggle'));
                autoFitControl(document.getElementById('knsdd-group-sort'));
                autoFitControl(document.getElementById('knsdd-advanced-filter'));
            });
        });

        // Yeni grup ekleme
        $('#knsdd-add-group').on('click', () => {
            const newGroup = $('#knsdd-new-group').val().trim();
            const ruleType = $('#knsdd-new-group-rule-type').val();

            if (!newGroup) {
                showNotice('error', knsdd_data.i18n.error_empty_group);
                return;
            }

            if (!ruleType) {
                showNotice('warning', '⚠️ ' + knsdd_data.i18n.rule_type_required);
                return;
            }

            ajaxRequest('add_group', { group: newGroup, rule_type: ruleType }, (data) => {
                knsdd_data.groups = data.groups; // Global veriyi güncelle
                knsdd_data.data.dates[newGroup] = { start: '', end: '' };
                knsdd_data.data.statuses[newGroup] = { status: 'closed', text: knsdd_data.i18n.status_no_date, className: 'status-incomplete' };
                if (!knsdd_data.data.paused) knsdd_data.data.paused = {};
                knsdd_data.data.paused[newGroup] = false; // varsayılan: duraklatılmamış

                // group_rule_types'ı güncelle
                if (!knsdd_data.group_rule_types) knsdd_data.group_rule_types = {};
                knsdd_data.group_rule_types[newGroup] = ruleType;

                $('#knsdd-new-group').val('');
                $('#knsdd-new-group-rule-type').val('');
                refreshTable();
                showNotice('success', knsdd_data.i18n.group_added.replace('%s', newGroup));
            });
        });

        // Tablo içi olaylar (delegation ile)
        $('#knsdd-toggle-tbody')
            .on('click', 'a.knsdd-manage-rules-link', function () {
                const $row = $(this).closest('tr');
                const group = $row.data('group');
                try { if (window.localStorage) localStorage.setItem('lastGroup', group); } catch (e) { }
                // Navigasyon doğal akışında devam etsin
            })
            // Tarih alanı tetikleyicisi: YA 'input' YA 'change' bağla (ikisi birden değil)
            .on(S.trigger_timing === 'realtime' ? 'input' : 'change', '.knsdd-date-input', handleDateChange)
            .on('click', '.knsdd-edit-group-action', function () {
                Modal.open($(this).data('group-name'));
            })
            .on('click', '.knsdd-delete-group-action', function () {
                const group = $(this).data('group-name');
                if (!confirm(knsdd_data.i18n.confirm_delete.replace('%s', group))) return;

                ajaxRequest('delete_group', { group: group }, (data) => {
                    knsdd_data.groups = data.groups;
                    delete knsdd_data.data.dates[group];
                    delete knsdd_data.data.statuses[group];
                    delete knsdd_data.data.rules[group];
                    if (knsdd_data.data.paused) { delete knsdd_data.data.paused[group]; }
                    refreshTable();
                    showNotice('success', knsdd_data.i18n.deleted_success.replace('%s', group));

                    // Refresh notification panel if open
                    if (typeof window.KNSDDNotificationPanel !== 'undefined' && window.KNSDDNotificationPanel) {
                        window.KNSDDNotificationPanel.refreshNotifications();
                    }
                });
            })
            .on('click', '.knsdd-duplicate-group-action', function () {
                const group = $(this).data('group-name');
                if (!confirm(knsdd_data.i18n.confirm_duplicate.replace('%s', group))) return;

                ajaxRequest('duplicate_group', { group: group }, (data) => {
                    knsdd_data.groups = data.groups;
                    knsdd_data.data = data.data;
                    // Yeni grubun tarihlerini boşalt (kurallar aynı kalsın)
                    const newGroup = data.new_group_name;
                    if (newGroup) {
                        if (!knsdd_data.data.dates) knsdd_data.data.dates = {};
                        knsdd_data.data.dates[newGroup] = { start: '', end: '' };
                        if (!knsdd_data.data.paused) knsdd_data.data.paused = {};
                        knsdd_data.data.paused[newGroup] = false;
                        if (!knsdd_data.data.statuses) knsdd_data.data.statuses = {};
                        knsdd_data.data.statuses[newGroup] = { status: 'closed', text: knsdd_data.i18n.status_no_date, className: 'status-incomplete' };
                    }
                    refreshTable();
                    showNotice('success', knsdd_data.i18n.duplicated_success.replace('%1$s', group).replace('%2$s', data.new_group_name));
                });
            })
            .on('change', '.knsdd-toggle-switch input', function () {
                const $row = $(this).closest('tr');
                const group = $row.data('group');
                const st = (knsdd_data.data && knsdd_data.data.statuses && knsdd_data.data.statuses[group]) || null;
                const cls = st && st.className ? st.className : '';
                // Guard: incomplete/pending/expired (tamamlanmış) durumlarında hiçbir işlem yapma
                if (cls === 'status-incomplete' || cls === 'status-pending' || cls === 'status-expired') {
                    // UI'ı orijinal haline geri al (toggle'ı tekrar eski haline set et)
                    const isPaused = !!(knsdd_data.data.paused && knsdd_data.data.paused[group]);
                    const shouldBeChecked = (!isPaused && st && st.status === 'open');
                    $(this).prop('checked', !!shouldBeChecked);
                    return;
                }

                const checked = $(this).is(':checked');
                // checked => paused=false, unchecked => paused=true
                const paused = checked ? 0 : 1;
                ajaxRequest('toggle_group_paused', { group, paused }, (data) => {
                    if (!knsdd_data.data.paused) knsdd_data.data.paused = {};
                    knsdd_data.data.paused[group] = !checked; // true ise duraklatılmış
                    knsdd_data.data.statuses[group] = data.status_info;
                    refreshTable();
                    showNotice('success', data.message);
                });
            });

        // File drag and drop
        $('#knsdd-file-drop-zone')
            .on('dragover dragenter', function (e) {
                e.preventDefault();
                e.stopPropagation();
                $(this).addClass('dragover');
            })
            .on('dragleave', function (e) {
                e.preventDefault();
                e.stopPropagation();
                $(this).removeClass('dragover');
            })
            .on('drop', function (e) {
                e.preventDefault();
                e.stopPropagation();
                $(this).removeClass('dragover');

                const files = e.originalEvent.dataTransfer.files;
                if (files.length > 0) {
                    handleFileSelect(files[0]);
                }
            });

        // Import/Export Event Handlers
        $('.knsdd-import-export-toolbar')
            // Locked pro actions must always redirect to upgrade and never open modals.
            .on('click', '.knsdd-pro-locked-action', function (e) {
                e.preventDefault();
                e.stopPropagation();
                e.stopImmediatePropagation();
                const url = $(this).data('upgrade-url') || (knsdd_data.license && knsdd_data.license.upgrade_url) || '#';
                if (url && url !== '#') {
                    window.open(url, '_blank');
                }
                return false;
            })
            // Export button now opens the export modal (no inline panel)
            .on('click', '#knsdd-export-button', function (e) {
                e.preventDefault();
                openExportModal();
            })
            .on('click', '#knsdd-import-groups', function (e) {
                e.preventDefault();
                openImportModal();
            });

        // Export Modal Events
        $('#knsdd-export-modal')
            .on('click', '.knsdd-modal-close', function () {
                closeExportModal();
            })
            .on('click', '#knsdd-export-cancel', function () {
                closeExportModal();
            })
            .on('change', '#knsdd-export-status-all', function () {
                const checked = $(this).is(':checked');
                if (checked) {
                    $('#knsdd-export-modal .knsdd-export-status').prop('checked', false);
                }
            })
            .on('change', '.knsdd-export-status', function () {
                if ($(this).is(':checked')) {
                    $('#knsdd-export-status-all').prop('checked', false);
                }
            })
            .on('click', '#knsdd-export-apply', function () {
                const statusAll = $('#knsdd-export-status-all').is(':checked');
                let statuses = [];
                if (!statusAll) {
                    $('#knsdd-export-modal .knsdd-export-status:checked').each(function () {
                        statuses.push($(this).val());
                    });
                }
                if (statusAll || statuses.length === 0) {
                    handleExport('all');
                } else {
                    handleExport('by_status', { statuses });
                }
                closeExportModal();
            });

        // Close export panel when clicking outside
        // Removed outside-click closing for the old panel

        // Import Modal Events
        $('#knsdd-import-groups-modal')
            .on('click', '.knsdd-modal-close', function () {
                closeImportModal();
            })
            .on('click', '#knsdd-cancel-import', function () {
                closeImportModal();
            })
            .on('click', '#knsdd-select-file-btn', function () {
                $('#knsdd-import-file').click();
            })
            .on('click', '#knsdd-file-drop-zone', function () {
                $('#knsdd-import-file').click();
            })
            .on('change', '#knsdd-import-file', function () {
                handleFileSelect(this.files[0]);
            })
            .on('click', '#knsdd-dry-run-import', function () {
                performImport('dry_run');
            })
            .on('click', '#knsdd-apply-import', function () {
                performImport('apply');
            });
    };

    // Import/Export Functions
    const handleExport = (exportType, options = {}) => {
        let groupList = [];
        let statusList = Array.isArray(options.statuses) ? options.statuses : [];

        if (exportType === 'filtered') {
            // Get currently visible groups from table
            groupList = [];
            $('#knsdd-toggle-tbody tr:visible').each(function () {
                const groupName = $(this).data('group');
                if (groupName) {
                    groupList.push(groupName);
                }
            });

            if (groupList.length === 0) {
                showNotice('error', 'Filtrelenmiş sonuçlarda dışa aktarılacak grup bulunamadı.');
                return;
            }
        }

        // Create form and submit
        const $form = $('<form>', {
            method: 'POST',
            action: knsdd_data.ajax_url,
            style: 'display: none;'
        });

        $form.append($('<input>', { name: 'action', value: 'knsdd_export_groups' }));
        $form.append($('<input>', { name: 'nonce', value: knsdd_data.nonce }));
        $form.append($('<input>', { name: 'export_type', value: exportType }));

        if (exportType === 'filtered' && groupList.length > 0) {
            groupList.forEach(group => {
                $form.append($('<input>', { name: 'group_list[]', value: group }));
            });
        }

        if (exportType === 'by_status' && statusList.length > 0) {
            statusList.forEach(st => {
                $form.append($('<input>', { name: 'status_list[]', value: st }));
            });
        }

        $('body').append($form);
        $form.submit();
        $form.remove();
    };

    let currentImportData = null;
    let validationReport = null;

    const openImportModal = () => {
        resetImportModal();
        $('#knsdd-import-groups-modal').show();
        // A11y: ESC ile kapatma ve ilk odağı belirleme
        $(document).off('keydown.knsddImportEsc').on('keydown.knsddImportEsc', function (e) {
            if (e.key === 'Escape' && $('#knsdd-import-groups-modal').is(':visible')) {
                e.preventDefault();
                closeImportModal();
            }
        });
        // İlk odak: Dosya Seç butonu, yoksa İptal
        const $firstFocus = $('#knsdd-select-file-btn').length ? $('#knsdd-select-file-btn') : $('#knsdd-cancel-import');
        $firstFocus.trigger('focus');
    };

    const closeImportModal = () => {
        $('#knsdd-import-groups-modal').hide();
        resetImportModal();
        // A11y: ESC dinleyicisini kaldır ve tetikleyici butona odağı geri ver
        $(document).off('keydown.knsddImportEsc');
        $('#knsdd-import-groups').trigger('focus');
    };

    const resetImportModal = () => {
        currentImportData = null;
        validationReport = null;

        // Reset file input
        $('#knsdd-import-file').val('');
        $('#knsdd-file-info').hide();
        $('#knsdd-file-drop-zone').show();

        // Reset steps
        $('.knsdd-import-step').hide();
        $('#knsdd-import-step-upload').show();

        // Reset buttons
        $('#knsdd-dry-run-import, #knsdd-apply-import').hide();
        $('#knsdd-apply-import').prop('disabled', true);
        $('#knsdd-cancel-import').show();
    };

    const handleFileSelect = (file) => {
        if (!file) return;

        if (file.type !== 'application/json' && !file.name.endsWith('.json')) {
            showNotice('error', knsdd_data.i18n.json_file_required || 'Please select a JSON file.');
            return;
        }

        if (file.size > 10 * 1024 * 1024) { // 10MB limit
            showNotice('error', 'Dosya çok büyük (10MB sınırı aşıldı).');
            return;
        }

        const reader = new FileReader();
        reader.onload = function (e) {
            try {
                currentImportData = JSON.parse(e.target.result);
                showFileInfo(file);
                $('#knsdd-dry-run-import').show();
            } catch (error) {
                showNotice('error', 'Geçersiz JSON dosyası: ' + error.message);
            }
        };
        reader.readAsText(file);
    };

    const showFileInfo = (file) => {
        const fileSize = formatFileSize(file.size);
        $('#knsdd-file-info .knsdd-file-name').text(file.name);
        $('#knsdd-file-info .knsdd-file-size').text(fileSize);
        $('#knsdd-file-info').show();
        $('#knsdd-file-drop-zone').hide();
    };

    const formatFileSize = (bytes) => {
        if (bytes === 0) return '0 Bytes';
        const k = 1024;
        const sizes = ['Bytes', 'KB', 'MB', 'GB'];
        const i = Math.floor(Math.log(bytes) / Math.log(k));
        return parseFloat((bytes / Math.pow(k, i)).toFixed(2)) + ' ' + sizes[i];
    };

    const performImport = (mode) => {
        if (!currentImportData) {
            showNotice('error', knsdd_data.i18n.file_required || 'Please select a file first.');
            return;
        }

        if (mode === 'apply' && (!validationReport || !validationReport.ok)) {
            showNotice('error', 'Önce doğrulama yapın.');
            return;
        }

        if (mode === 'apply') {
            showImportProgress();
        }

        const requestData = {
            action: 'knsdd_import_groups',
            nonce: knsdd_data.nonce,
            mode: mode,
            import_data: JSON.stringify(currentImportData)
        };

        $.post(knsdd_data.ajax_url, requestData)
            .done(function (response) {
                if (response.success) {
                    if (mode === 'dry_run') {
                        validationReport = response.data.report;
                        showValidationReport(validationReport);
                    } else if (mode === 'apply') {
                        showImportComplete(response.data.apply_result);
                        // Refresh page data
                        setTimeout(() => {
                            location.reload();
                        }, 2000);
                    }
                } else {
                    showNotice('error', response.data.message || (knsdd_data.i18n.unknown_error || 'An unknown error occurred.'));
                    resetImportModal();
                }
            })
            .fail(function () {
                showNotice('error', knsdd_data.i18n.network_error || 'Connection failed.');
                resetImportModal();
            });
    };

    const showValidationReport = (report) => {
        $('.knsdd-import-step').hide();
        $('#knsdd-import-step-validation').show();

        const $summary = $('#knsdd-validation-summary');
        const $details = $('#knsdd-validation-details');

        // Summary
        if (report.ok) {
            $summary.removeClass('error warning').addClass('success');
            $summary.text(`✓ Doğrulama başarılı: ${report.groups_count} grup içe aktarılmaya hazır.`);
            $('#knsdd-apply-import').prop('disabled', false).show();
        } else {
            $summary.removeClass('success warning').addClass('error');
            $summary.text(`✗ Doğrulama başarısız: ${report.errors.length} hata bulundu.`);
            $('#knsdd-apply-import').prop('disabled', true).show();
        }

        if (report.warnings && report.warnings.length > 0) {
            $summary.addClass('warning');
        }

        // Details
        $details.empty();

        if (report.errors && report.errors.length > 0) {
            report.errors.forEach(error => {
                const $item = $('<div class="knsdd-validation-item error">');
                $item.append($('<span class="knsdd-validation-item-code">').text(error.code));
                $item.append(error.message);
                $details.append($item);
            });
        }

        if (report.warnings && report.warnings.length > 0) {
            report.warnings.forEach(warning => {
                const $item = $('<div class="knsdd-validation-item warning">');
                $item.append($('<span class="knsdd-validation-item-code">').text(warning.code));
                $item.append(warning.message);
                $details.append($item);
            });
        }

        if (report.ok && (!report.warnings || report.warnings.length === 0)) {
            $details.append('<div class="knsdd-validation-item">Tüm kontroller başarıyla geçildi.</div>');
        }
    };

    const showImportProgress = () => {
        $('.knsdd-import-step').hide();
        $('#knsdd-import-step-progress').show();
        $('#knsdd-cancel-import').hide();

        // Animate progress bar
        let progress = 0;
        const interval = setInterval(() => {
            progress += Math.random() * 15;
            if (progress > 90) progress = 90;
            $('#knsdd-import-progress-fill').css('width', progress + '%');
        }, 200);

        // Store interval for cleanup
        $('#knsdd-import-progress-fill').data('interval', interval);
    };

    const showImportComplete = (result) => {
        // Clear progress interval
        const interval = $('#knsdd-import-progress-fill').data('interval');
        if (interval) clearInterval(interval);

        $('#knsdd-import-progress-fill').css('width', '100%');

        setTimeout(() => {
            $('.knsdd-import-step').hide();
            $('#knsdd-import-step-complete').show();

            const $results = $('#knsdd-import-results');
            $results.html(`
                <h5>✓ ${result.message}</h5>
                <ul>
                    <li>Yeni gruplar: ${result.imported_count}</li>
                    <li>Güncellenen gruplar: ${result.updated_count}</li>
                    <li>Toplam grup sayısı: ${result.total_groups}</li>
                </ul>
            `);

            $('#knsdd-cancel-import').text('Kapat').show();
        }, 500);
    };

    // Export Modal helpers
    const openExportModal = () => {
        // Reset state: default to ALL checked
        $('#knsdd-export-status-all').prop('checked', true);
        $('#knsdd-export-modal .knsdd-export-status').prop('checked', false);
        $('#knsdd-export-modal').show();
        // A11y: ESC ile kapatma için keydown dinleyicisi ekle ve odağı ilk odaklanabilir elemana taşı
        $(document).off('keydown.knsddExportEsc').on('keydown.knsddExportEsc', function (e) {
            if (e.key === 'Escape' && $('#knsdd-export-modal').is(':visible')) {
                e.preventDefault();
                closeExportModal();
            }
        });
        // İlk odak: "Tüm Gruplar" checkbox'ı
        $('#knsdd-export-status-all').trigger('focus');
    };

    const closeExportModal = () => {
        $('#knsdd-export-modal').hide();
        // A11y: ESC dinleyicisini kaldır
        $(document).off('keydown.knsddExportEsc');
        // Tetikleyici butona odağı geri ver
        $('#knsdd-export-button').trigger('focus');
    };

    // Sayfayı başlat
    init();
});
