/**
 * KNSDD Grup Yönetimi - Arayüz Çizim (Render) Modülü
 *
 * Ekrana HTML çizmekle ilgili tüm fonksiyonları içerir.
 * Tabloyu oluşturur ve Flatpickr gibi üçüncü parti kütüphaneleri başlatır.
 */
window.KNSDDGroups = window.KNSDDGroups || {};

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

    const $toggleTbody = $('#knsdd-toggle-tbody');
    const $statusManagementSection = $('#knsdd-status-management');
    const $noGroupMessage = $('#knsdd-no-group-message');

    /**
     * Flatpickr tarih seçicisine hızlı seçim butonları ekler.
     * @param {object} instance - Flatpickr örneği.
     */
    const addQuickSelectButtons = (instance) => {
        if (instance.calendarContainer.querySelector('.flatpickr-quick-select')) return;
        const container = document.createElement('div');
        container.className = 'flatpickr-quick-select';

        const S = (typeof knsdd_data !== 'undefined' && knsdd_data.settings) ? knsdd_data.settings : {};
        const i18n = knsdd_data.i18n || {};

        // --- Yardımcılar (UTC tabanlı, Y-M-D güvenli) ---
        const ymdToUTC = (ymd) => {
            const [y, m, d] = String(ymd).split('-').map(Number);
            return new Date(Date.UTC(y, (m || 1) - 1, d || 1));
        };
        const addDaysUTC = (date, days) => {
            const d = new Date(date.getTime());
            d.setUTCDate(d.getUTCDate() + days);
            return d;
        };
        const fmtYMD = (date) => date.toISOString().slice(0, 10);
        const getMonthStartUTC = (date) => new Date(Date.UTC(date.getUTCFullYear(), date.getUTCMonth(), 1));
        const getMonthEndUTC = (date) => new Date(Date.UTC(date.getUTCFullYear(), date.getUTCMonth() + 1, 0));
        const getWeekStartUTC = (date, weekStart) => {
            const day = date.getUTCDay(); // 0=PAZ ... 6=CMT
            const diff = (day - weekStart + 7) % 7;
            return addDaysUTC(date, -diff);
        };

        // Site "bugün" değerini güvenli şekilde al (Y-M-D)
        const siteTodayYmd = (S && S.site_today_ymd) ? String(S.site_today_ymd) : (S && S.site_now_iso ? String(S.site_now_iso).slice(0, 10) : new Date().toISOString().slice(0, 10));
        const weekStart = (typeof S.week_start !== 'undefined') ? Number(S.week_start) : 1; // WP varsayılan: Pazartesi

        const todayUTC = ymdToUTC(siteTodayYmd);
        const tomorrowUTC = addDaysUTC(todayUTC, 1);
        const thisWeekStartUTC = getWeekStartUTC(todayUTC, weekStart);
        const thisWeekEndUTC = addDaysUTC(thisWeekStartUTC, 6);
        const nextWeekStartUTC = addDaysUTC(thisWeekStartUTC, 7);
        const nextWeekEndUTC = addDaysUTC(thisWeekEndUTC, 7);
        const thisMonthStartUTC = getMonthStartUTC(todayUTC);
        const thisMonthEndUTC = getMonthEndUTC(todayUTC);

        // "Bu Hafta": Eğer hafta başı geçmişse, bugünden başlat (backend validasyonu için)
        const thisWeekStartAdjusted = (thisWeekStartUTC < todayUTC) ? todayUTC : thisWeekStartUTC;
        // "Bu Ay": Eğer ay başı geçmişse, bugünden başlat (backend validasyonu için)
        const thisMonthStartAdjusted = (thisMonthStartUTC < todayUTC) ? todayUTC : thisMonthStartUTC;

        const buttons = [
            { label: i18n.today || 'Bugün', start: fmtYMD(todayUTC), end: fmtYMD(todayUTC), onlyStart: true }, // Sadece başlangıç doldurur
            { label: i18n.tomorrow || 'Yarın', start: fmtYMD(tomorrowUTC), end: fmtYMD(tomorrowUTC), onlyStart: true }, // Sadece başlangıç doldurur
            { label: i18n.this_week || 'Bu Hafta', start: fmtYMD(thisWeekStartAdjusted), end: fmtYMD(thisWeekEndUTC) },
            { label: i18n.next_week || 'Gelecek Hafta', start: fmtYMD(nextWeekStartUTC), end: fmtYMD(nextWeekEndUTC) },
            { label: i18n.this_month || 'Bu Ay', start: fmtYMD(thisMonthStartAdjusted), end: fmtYMD(thisMonthEndUTC) }
        ];

        buttons.forEach(btnData => {
            const button = document.createElement('button');
            button.type = 'button';
            button.className = 'flatpickr-quick-select-button';
            button.textContent = btnData.label;
            button.addEventListener('click', (e) => {
                e.preventDefault();
                const $row = $(instance.element).closest('tr');
                const $startInput = $row.find('.knsdd-start-date');
                const $endInput = $row.find('.knsdd-end-date');

                // Flatpickr instance'larını kontrol et
                if (!$startInput[0] || !$startInput[0]._flatpickr || !$endInput[0] || !$endInput[0]._flatpickr) {
                    console.error('KNSDD: Flatpickr instances not found');
                    return;
                }

                const startPicker = $startInput[0]._flatpickr;
                const endPicker = $endInput[0]._flatpickr;
                const isSingleDay = btnData.start === btnData.end;
                const isStartField = $(instance.element).hasClass('knsdd-start-date');

                if (btnData.onlyStart) {
                    // Tek gün kısayolları (Bugün/Yarın): sadece aktif alanı güncelle
                    if (isStartField) {
                        // Başlangıç alanı açıkken: sadece başlangıç tarihini ayarla, bitişe dokunma
                        startPicker.set('minDate', null);
                        startPicker.set('maxDate', null);
                        startPicker.setDate(btnData.start, true); // onChange tetikle
                        // Bitiş için en erken seçilebilir tarihi güncelle
                        endPicker.set('minDate', btnData.start);
                    } else {
                        // Bitiş alanı açıkken: sadece bitiş tarihini ayarla, başlangıca dokunma
                        endPicker.set('minDate', null);
                        endPicker.set('maxDate', null);
                        endPicker.setDate(btnData.end, true); // onChange tetikle
                        // Başlangıcın en geç seçilebilir tarihini güncelle
                        startPicker.set('maxDate', btnData.end);
                    }
                } else if (isSingleDay) {
                    // Tek gün (Yarın): Her iki alanı da aynı tarihle doldur
                    // Önce TÜM kısıtlamaları kaldır
                    startPicker.set('minDate', null);
                    startPicker.set('maxDate', null);
                    endPicker.set('minDate', null);
                    endPicker.set('maxDate', null);
                    // Tarihleri set et (bitiş tarihinde onChange tetikle - AJAX için)
                    startPicker.setDate(btnData.start, false);
                    endPicker.setDate(btnData.end, true); // onChange tetikle
                    // Kısıtlamaları yeniden uygula
                    startPicker.set('maxDate', btnData.end);
                    endPicker.set('minDate', btnData.start);
                } else {
                    // Aralık: Her iki alanı doldur
                    // Önce TÜM kısıtlamaları kaldır (minDate dahil - geçmiş hafta başlangıçları için)
                    startPicker.set('minDate', null);
                    startPicker.set('maxDate', null);
                    endPicker.set('minDate', null);
                    endPicker.set('maxDate', null);

                    // Tarihleri set et (bitiş tarihinde onChange tetikle - AJAX için)
                    startPicker.setDate(btnData.start, false);
                    endPicker.setDate(btnData.end, true); // onChange tetikle

                    // Kısıtlamaları yeniden uygula
                    startPicker.set('maxDate', btnData.end);
                    endPicker.set('minDate', btnData.start);
                }

                instance.close();
            });
            container.appendChild(button);
        });
        instance.calendarContainer.appendChild(container);
    };

    /**
     * İşlenmiş grup listesini alarak ana tabloyu ekrana çizer.
     * @param {object} result - {groups: Array, totalCount: number, totalPages: number, currentPage: number}
     */
    const table = (result) => {
        const groupsToRender = result.groups || [];
        // Settings nesnesini al (lock_started_campaigns için gerekli)
        const S = (typeof knsdd_data !== 'undefined' && knsdd_data.settings) ? knsdd_data.settings : {};

        $toggleTbody.empty();
        if (groupsToRender.length === 0) {
            // Her durumda kart (toolbar + filtreler + tablo başlığı) görünür kalsın
            $statusManagementSection.show();
            if (knsdd_data.groups.length > 0) {
                const msg = knsdd_data.i18n.no_match || 'Filtre ile eşleşen grup bulunamadı.';
                $noGroupMessage.hide();
                $toggleTbody.append(`<tr><td colspan="6">${msg}</td></tr>`);
            } else {
                // Hiç grup yok: bilgilendirme kartını göster, tabloda da sabit i18n placeholder göster
                $noGroupMessage.show();
                const none = (knsdd_data.i18n && knsdd_data.i18n.no_groups_message) ? knsdd_data.i18n.no_groups_message : 'Başlamak için lütfen bir grup oluşturun.';
                $toggleTbody.append(`<tr><td colspan="6">${none}</td></tr>`);
            }
            return;
        }
        $statusManagementSection.show();
        $noGroupMessage.hide();

        groupsToRender.forEach(group => {
            const dates = knsdd_data.data.dates[group] || { start: '', end: '' };
            const statusInfo = knsdd_data.data.statuses[group];
            const isPaused = !!(knsdd_data.data.paused && knsdd_data.data.paused[group]);
            const isChecked = (!isPaused && statusInfo.status === 'open') ? 'checked' : '';
            const statusCls = (statusInfo && statusInfo.className) ? statusInfo.className : '';
            const isDisabled = ['status-incomplete', 'status-pending', 'status-expired'].includes(statusCls);
            const isExpired = statusCls === 'status-expired'; // Tamamlanmış kampanyalar için özel kontrol

            // Bugünün tarihi (YYYY-MM-DD formatında)
            const today = new Date().toISOString().split('T')[0];

            // Başlangıç tarihi geçmişse VE bitiş tarihi de girilmişse kilitli
            // (Her iki tarih de varsa kampanya "başlamış" sayılır)
            // Sadece başlangıç varsa henüz ayarlama aşamasında, düzeltilebilir
            // lock_started_campaigns ayarı kapalıysa kilit devre dışı
            const lockStartedEnabled = S && S.lock_started_campaigns ? (S.lock_started_campaigns == 1) : true;
            const isStartLocked = lockStartedEnabled && !isExpired && dates.start && dates.end && dates.start <= today;

            // Tarih formatla (disabled input'lar için) - Kullanıcının ayar sayfasında seçtiği format
            const formatDate = (isoDate) => {
                if (!isoDate) return '';
                const parts = isoDate.split('-'); // [YYYY, MM, DD]
                if (parts.length !== 3) return isoDate;

                const year = parts[0];
                const month = parts[1];
                const day = parts[2];

                // Kullanıcının seçtiği format (ayarlar sayfasından)
                const userFormat = knsdd_data.date_format || 'd.m.Y';

                // Format'a göre ayraç belirle ve düzenle
                if (userFormat.includes('/')) {
                    // d/m/Y formatı
                    return `${day}/${month}/${year}`;
                } else if (userFormat.includes('.')) {
                    // d.m.Y formatı
                    return `${day}.${month}.${year}`;
                } else if (userFormat.startsWith('Y')) {
                    // Y-m-d formatı (ISO)
                    return `${year}-${month}-${day}`;
                } else {
                    // Fallback: d.m.Y
                    return `${day}.${month}.${year}`;
                }
            };
            const startFormatted = (isExpired || isStartLocked) ? formatDate(dates.start) : dates.start;
            const endFormatted = isExpired ? formatDate(dates.end) : dates.end;
            // Tek rozet kuralı: Paused sadece 'open' iken ana rozet olarak gözüksün; aksi halde temel durum rozeti kalsın
            const showPausedAsPrimary = isPaused && statusInfo.status === 'open';
            const primaryBadgeText = showPausedAsPrimary ? (knsdd_data.i18n.manual_paused || 'Manuel Pasif') : statusInfo.text;
            const primaryBadgeClass = showPausedAsPrimary ? 'status-paused' : statusInfo.className;
            const rulesPageUrl = `admin.php?page=knsdd-rules&group=${encodeURIComponent(group)}`;
            // Expired kampanyalarda "Kuralları Görüntüle" metni
            const manageRulesText = isExpired ? (knsdd_data.i18n.view_rules || 'Kuralları Görüntüle') : knsdd_data.i18n.manage_rules;
            // Grup kural tipi (renk kodlaması için)
            const groupRuleType = (knsdd_data.group_rule_types && knsdd_data.group_rule_types[group]) || 'fixed_discount';
            const row = `
                <tr data-group="${group}" data-rule-type="${groupRuleType}">
                    <td>
                        <input type="checkbox" class="knsdd-group-checkbox" data-group="${group}" data-status="${statusInfo.status}" style="margin-right: 4px; vertical-align: middle;">
                        ${group}
                    </td>
                    <td><input type="text" class="knsdd-date-input knsdd-start-date" placeholder="${knsdd_data.i18n.start_label}" value="${startFormatted}" data-iso="${dates.start || ''}" ${isExpired || isStartLocked ? 'disabled' : ''}></td>
                    <td><input type="text" class="knsdd-date-input knsdd-end-date" placeholder="${knsdd_data.i18n.end_label}" value="${endFormatted}" data-iso="${dates.end || ''}" ${isExpired ? 'disabled' : ''}></td>
                    <td>
                        <label class="knsdd-toggle-switch ${isDisabled ? 'is-disabled' : ''}">
                            <input type="checkbox" ${isChecked} ${isDisabled ? 'disabled' : ''}>
                            <span class="knsdd-toggle-slider"></span>
                        </label>
                    </td>
                    <td>
                        <span class="knsdd-status-badge ${primaryBadgeClass}">${primaryBadgeText}</span>
                    </td>
                    <td>
                        <div class="knsdd-actions-wrapper">
                            <a href="${rulesPageUrl}" class="knsdd-action-btn knsdd-manage-rules-link" title="${manageRulesText}">
                                <svg viewBox="0 0 24 24" width="16" height="16" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true">
                                    <!-- outline document + pencil icon -->
                                    <path d="M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12V8l-4-6z"/>
                                    <path d="M14 2v6h6"/>
                                    <path d="M11 17h2l7-7-2-2-7 7v2z"/>
                                </svg>
                            </a>
                            <button type="button" class="knsdd-action-btn knsdd-duplicate-group-action" title="${knsdd_data.i18n.duplicate_group}" data-group-name="${group}" ${isExpired ? 'disabled' : ''}>
                                <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-edit-group-action" title="${knsdd_data.i18n.edit_group}" data-group-name="${group}" ${isExpired ? 'disabled' : ''}>
                                <svg viewBox="0 0 24 24" width="16" height="16" fill="currentColor" aria-hidden="true"><path d="M3 17.25V21h3.75L17.81 9.94l-3.75-3.75L3 17.25zM21.41 6.34a1.25 1.25 0 000-1.77l-2.98-2.98a1.25 1.25 0 00-1.77 0l-1.83 1.83 3.75 3.75 1.83-1.83z"/></svg>
                            </button>
                            <button type="button" class="knsdd-action-btn knsdd-delete-group-action" title="${knsdd_data.i18n.delete_group}" data-group-name="${group}">
                                <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>`;
            $toggleTbody.append(row);
        });

        // Flatpickr'ı yeni eklenen inputlar için başlat
        // Başlangıç ve bitiş tarihleri birbirine bağlanır (başlangıç <= bitiş kısıtlaması)
        $('.knsdd-start-date').each(function () {
            // Disabled input'larda Flatpickr başlatma (zaten manuel formatladık)
            if ($(this).prop('disabled')) {
                return;
            }

            if (this._flatpickr) this._flatpickr.destroy();
            const $row = $(this).closest('tr');
            const $endInput = $row.find('.knsdd-end-date');
            const endDateISO = $endInput.data('iso');

            $(this).flatpickr({
                altInput: true,
                altFormat: knsdd_data.date_format || 'd.m.Y',
                dateFormat: 'Y-m-d',
                defaultDate: $(this).data('iso') || null,
                minDate: 'today', // Geçmiş tarih seçilemez
                maxDate: endDateISO || null, // Bitiş tarihi varsa başlangıç için maksimum değer
                locale: knsdd_data.i18n.fp_locale || undefined,
                onReady: (selectedDates, dateStr, instance) => { addQuickSelectButtons(instance); },
                onChange: function (selectedDates) {
                    // Başlangıç seçildiğinde, bitiş tarihinin minimum değerini güncelle
                    if (selectedDates.length > 0 && $endInput[0] && $endInput[0]._flatpickr) {
                        $endInput[0]._flatpickr.set('minDate', selectedDates[0]);
                    }
                }
            });
        });

        $('.knsdd-end-date').each(function () {
            // Disabled input'larda Flatpickr başlatma (zaten manuel formatladık)
            if ($(this).prop('disabled')) {
                return;
            }

            if (this._flatpickr) this._flatpickr.destroy();
            const $row = $(this).closest('tr');
            const $startInput = $row.find('.knsdd-start-date');
            const startDateISO = $startInput.data('iso');

            // minDate: Başlangıç ve bugün arasında büyük olanı kullan
            // Eğer başlangıç geçmişse (örn: 27.10), bugünü kullan (01.11)
            // Eğer başlangıç geleceğeyse, onu kullan
            let minDateValue = 'today';
            if (startDateISO) {
                const siteTodayYmd = knsdd_data.site_today_ymd || new Date().toISOString().slice(0, 10);
                minDateValue = (startDateISO < siteTodayYmd) ? 'today' : startDateISO;
            }

            $(this).flatpickr({
                altInput: true,
                altFormat: knsdd_data.date_format || 'd.m.Y',
                dateFormat: 'Y-m-d',
                defaultDate: $(this).data('iso') || null,
                minDate: minDateValue, // Bugün veya başlangıç (ikisinden büyük olanı)
                locale: knsdd_data.i18n.fp_locale || undefined,
                onReady: (selectedDates, dateStr, instance) => { addQuickSelectButtons(instance); },
                onChange: function (selectedDates) {
                    // Bitiş seçildiğinde, başlangıç tarihinin maksimum değerini güncelle
                    if (selectedDates.length > 0 && $startInput[0] && $startInput[0]._flatpickr) {
                        $startInput[0]._flatpickr.set('maxDate', selectedDates[0]);
                    }
                }
            });
        });

        // Toplu işlemler toolbar'ını göster (en az 1 grup varsa)
        if (groupsToRender.length > 0) {
            $('.knsdd-bulk-actions-toolbar').show();
        } else {
            $('.knsdd-bulk-actions-toolbar').hide();
        }

        // Sayfalama bilgisini güncelle
        updatePagination(result);
    };

    /**
     * Sayfalama kontrollerini günceller.
     * @param {object} result - {totalCount, totalPages, currentPage}
     */
    const updatePagination = (result) => {
        const $pagination = $('#knsdd-pagination');
        if (!$pagination.length) return;

        const { totalCount, totalPages, currentPage } = result;

        if (totalPages <= 1) {
            $pagination.hide();
            return;
        }

        $pagination.show();

        // Sayfa bilgisi
        const perPage = 10;
        const startItem = totalCount === 0 ? 0 : ((currentPage - 1) * perPage) + 1;
        const endItem = Math.min(currentPage * perPage, totalCount);
        $('#knsdd-pagination-info').text(`${startItem}-${endItem} / ${totalCount}`);

        // Buton durumları
        $('#knsdd-pagination-prev').prop('disabled', currentPage <= 1);
        $('#knsdd-pagination-next').prop('disabled', currentPage >= totalPages);
        $('#knsdd-pagination-first').prop('disabled', currentPage <= 1);
        $('#knsdd-pagination-last').prop('disabled', currentPage >= totalPages);
    };

    /**
     * Filtreleme alanlarındaki metinleri ve seçenekleri i18n verilerine göre günceller.
     */
    const initFilterI18n = () => {
        const i18n = knsdd_data.i18n || {};
        $('#knsdd-group-search').attr('placeholder', i18n.search_placeholder);
        $('label[for="knsdd-status-filter"]').text(i18n.label_status + ':');
        $('label[for="knsdd-group-sort"]').text(i18n.label_sort);
        $('label[for="knsdd-advanced-filter"]').text(i18n.label_adv);

        const mapText = (sel, mapArr) => {
            $(sel).find('option').each(function () {
                const v = $(this).val(); if (mapArr[v]) $(this).text(mapArr[v]);
            });
        };
        mapText('#knsdd-status-filter', { all: i18n.status_all, open: i18n.status_open, 'closed-pending': i18n.status_pending, 'closed-expired': i18n.status_expired });
        mapText('#knsdd-group-sort', { 'all': (i18n.sort_all || 'Tümü'), 'creation-desc': i18n.sort_creation_desc, 'creation-asc': i18n.sort_creation_asc, 'start-date-asc': i18n.sort_start_asc, 'start-date-desc': i18n.sort_start_desc, 'end-date-asc': i18n.sort_end_asc, 'end-date-desc': i18n.sort_end_desc });
        mapText('#knsdd-advanced-filter', { all: i18n.adv_all, has_rules: i18n.adv_has_rules, no_rules: i18n.adv_no_rules, has_special_campaign: i18n.adv_has_special, has_standard_discount: i18n.adv_has_standard, has_members_only: i18n.adv_has_members_only, has_first_order_only: i18n.adv_has_first_order });
    };

    /**
     * Filtre arayüzünü, yerel depodan yüklenen değerlerle doldurur.
     * @param {object} filters - Uygulanacak filtre değerleri.
     */
    const applyFiltersToUI = (filters) => {
        $('#knsdd-group-search').val(filters.searchTerm);
        $('#knsdd-group-sort').val(filters.sortOption);
        $('#knsdd-advanced-filter').val(filters.advancedFilter);

        // Durum filtresi checkbox'larını ayarla
        if (Array.isArray(filters.statusFilter)) {
            $('.knsdd-status-filter-checkbox-item input[type="checkbox"]').prop('checked', false);
            $('.knsdd-status-filter-checkbox-item').attr('aria-checked', 'false');

            filters.statusFilter.forEach(status => {
                const $checkbox = $(`.knsdd-status-filter-checkbox-item input[value="${status}"]`);
                $checkbox.prop('checked', true);
                $checkbox.closest('.knsdd-status-filter-checkbox-item').attr('aria-checked', 'true');
            });
        }
    };

    // Dışarıya açılacak fonksiyonlar
    return {
        table: table,
        initFilterI18n: initFilterI18n,
        applyFiltersToUI: applyFiltersToUI,
        updatePagination: updatePagination
    };

})(jQuery);
