/**
 * KNSDD Grup Yönetimi - Veri İşleme Modülü
 *
 * Ham grup verisini alır ve mevcut filtrelere göre işler (filtreleme, sıralama).
 * Sonucu, arayüzde gösterilmeye hazır bir dizi olarak döndürür.
 */
window.KNSDDGroups = window.KNSDDGroups || {};

KNSDDGroups.data = (function() {
    'use strict';

    /**
     * Grupları, sağlanan filtrelere göre işler.
     * @param {Array} allGroups - İşlenmemiş tüm grup adlarının dizisi.
     * @param {object} filters - Uygulanacak filtreler (searchTerm, statusFilter vb.).
     * @returns {object} - {groups: Array, totalCount: number, totalPages: number}
     */
    const process = (allGroups, filters) => {
        let groupsToRender = [...allGroups];

        // 1. Filtreleme Aşaması
        if (filters.searchTerm) {
            const searchTerm = filters.searchTerm.toLowerCase();
            groupsToRender = groupsToRender.filter(group => group.toLowerCase().includes(searchTerm));
        }

        if (Array.isArray(filters.statusFilter) && filters.statusFilter.length > 0) {
            groupsToRender = groupsToRender.filter(group => {
                const statusInfo = knsdd_data.data.statuses[group];
                if (!statusInfo) return false;
                const isPaused = !!(knsdd_data.data.paused && knsdd_data.data.paused[group]);
                
                return filters.statusFilter.some(status => {
                    if (status === 'open') return statusInfo.status === 'open' && !isPaused;
                    if (status === 'paused') return isPaused;
                    if (status === 'closed-pending') return statusInfo.className === 'status-pending';
                    if (status === 'closed-expired') return statusInfo.className === 'status-expired';
                    if (status === 'closed-incomplete') return statusInfo.className === 'status-incomplete';
                    return false;
                });
            });
        }

        if (filters.advancedFilter && filters.advancedFilter !== 'all') {
            groupsToRender = groupsToRender.filter(group => {
                const rules = knsdd_data.data.rules[group] || [];
                switch (filters.advancedFilter) {
                    case 'has_rules': return rules.length > 0;
                    case 'no_rules': return rules.length === 0;
                    case 'has_special_campaign': return rules.some(rule => rule.rule_type === 'special_campaign');
                    case 'has_standard_discount': return rules.some(rule => rule.rule_type === 'standard_discount');
                    case 'has_members_only': return rules.some(rule => rule.login_required === true);
                    case 'has_first_order_only': return rules.some(rule => rule.first_order_only === true);
                    default: return true;
                }
            });
        }

        // 2. Sıralama Aşaması
        if (filters.sortOption && filters.sortOption !== 'all') {
            groupsToRender.sort((a, b) => {
                switch (filters.sortOption) {
                    case 'creation-desc': return knsdd_data.groups.indexOf(b) - knsdd_data.groups.indexOf(a);
                    case 'creation-asc': return knsdd_data.groups.indexOf(a) - knsdd_data.groups.indexOf(b);
                    case 'end-date-asc': return new Date(knsdd_data.data.dates[a]?.end) - new Date(knsdd_data.data.dates[b]?.end);
                    case 'end-date-desc': return new Date(knsdd_data.data.dates[b]?.end) - new Date(knsdd_data.data.dates[a]?.end);
                    case 'start-date-asc': return new Date(knsdd_data.data.dates[a]?.start) - new Date(knsdd_data.data.dates[b]?.start);
                    case 'start-date-desc': return new Date(knsdd_data.data.dates[b]?.start) - new Date(knsdd_data.data.dates[a]?.start);
                    default: return 0;
                }
            });
        }

        // 3. Sayfalama
        const totalCount = groupsToRender.length;
        const perPage = filters.perPage || 10;
        const totalPages = Math.ceil(totalCount / perPage);
        const currentPage = Math.min(filters.currentPage || 1, totalPages || 1);
        const startIndex = (currentPage - 1) * perPage;
        const endIndex = startIndex + perPage;
        const paginatedGroups = groupsToRender.slice(startIndex, endIndex);

        return {
            groups: paginatedGroups,
            totalCount: totalCount,
            totalPages: totalPages,
            currentPage: currentPage
        };
    };

    // Dışarıya açılacak fonksiyonlar
    return {
        process: process
    };

})();
