/**
 * KNSDD Kural Yönetimi - Doğrulayıcılar Modülü
 *
 * Bu dosya, kural satırlarının geçerliliğini kontrol eden fonksiyonları içerir.
 * Kopya kural tespiti ve boş satır kontrolü gibi mantıklar burada yer alır.
 */
window.KNSDDRules = window.KNSDDRules || {};

KNSDDRules.validators = (function() {
    'use strict';

    /**
     * Bir kural satırının tüm ayarlarını içeren benzersiz bir imza (string) oluşturur.
     * Bu imza, aynı ayarlara sahip kopya kuralları tespit etmek için kullanılır.
     * @param {jQuery} $row - İmzanın oluşturulacağı tablo satırı (<tr>).
     * @returns {string} - Kuralın ayarlarını içeren JSON string'i.
     */
    const buildRowSignature = ($row) => {
        const category = $row.find('.knsdd-rule-category').val() || '';
        const productValues = ($row.find('.knsdd-rule-product').val() || []).slice().sort();
        const min = String($row.find('.knsdd-rule-min').val() || 0);
        const max = String($row.find('.knsdd-rule-max').val() || 0);
        const loginRequired = $row.find('.knsdd-rule-login-required').is(':checked') ? '1' : '0';
        const allowedCustomers = ($row.find('.knsdd-customer-select').val() || []).slice().sort();
        const ruleData = $row.data('ruleData') || {};
        const ruleType = ruleData.rule_type || 'standard_discount';

        const base = {
            category,
            product: productValues,
            min,
            max,
            loginRequired,
            allowedCustomers,
            ruleType
        };

        if (ruleType === 'special_campaign') {
            const rd = $row.data('ruleData') || {};
            base.campaignType = rd.campaign_type || '';
            base.buyX = String(rd.buy_x || '');
            base.payY = String(rd.pay_y || '');
            base.nth = String(rd.nth || '');
            // nth campaign: use explicit discount_type/discount_value only
            const nthType = (rd.discount_type === 'amount' || rd.discount_type === 'percentage')
                ? rd.discount_type
                : '';
            const nthValue = (typeof rd.discount_value !== 'undefined')
                ? rd.discount_value
                : '';
            base.nth_discount_type = String(nthType || '');
            base.nth_discount_value = String(nthValue || '');
            // Yeni kampanya alanları
            base.min_cart_total = String(rd.min_cart_total || '');
            base.discount_type_ct = String(rd.discount_type || ''); // ct for cart_total
            base.discount_value_ct = String(rd.discount_value || '');
            // BOGO alanları (kategori + ürün kombinasyonu)
            base.trigger_category = String(rd.trigger_category || '');
            base.trigger_products = (rd.trigger_products || []).slice().sort();
            base.trigger_quantity = String(rd.trigger_quantity || '');
            base.target_category = String(rd.target_category || '');
            base.target_products = (rd.target_products || []).slice().sort();
            base.target_quantity = String(rd.target_quantity || '');
            base.bogo_discount_type = String(rd.discount_type || '');
            base.bogo_discount_value = String(rd.discount_value || '');
        } else {
            base.discountType = $row.find('.knsdd-rule-discount-type').val() || 'percent';
            base.discountValue = String($row.find('.knsdd-rule-discount-value').val() || 0);
        }

        return JSON.stringify(base);
    };

    /**
     * Bir kural nesnesinden (persist edilen form) benzersiz imza üretir.
     * @param {object} rule
     * @returns {string}
     */
    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 || '');
            // nth campaign: include explicit discount type/value only
            const nthType = (rule.discount_type === 'amount' || rule.discount_type === 'percentage')
                ? rule.discount_type
                : '';
            const nthValue = (typeof rule.discount_value !== 'undefined')
                ? rule.discount_value
                : '';
            base.nth_discount_type = String(nthType || '');
            base.nth_discount_value = String(nthValue || '');
            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 || '');
            // BOGO alanları (kategori + ürün kombinasyonu)
            base.trigger_category = String(rule.trigger_category || '');
            base.trigger_products = (rule.trigger_products || []).slice().sort();
            base.trigger_quantity = String(rule.trigger_quantity || '');
            base.target_category = String(rule.target_category || '');
            base.target_products = (rule.target_products || []).slice().sort();
            base.target_quantity = String(rule.target_quantity || '');
            base.bogo_discount_type = String(rule.discount_type || '');
            base.bogo_discount_value = String(rule.discount_value || '');
        } else {
            base.discountType = rule.discount_type || 'percent';
            base.discountValue = String(rule.discount_value || 0);
        }

        return JSON.stringify(base);
    };

    /**
     * İki kural listesi (nesne) aynı içerikte mi? (sıra bağımsız, adet duyarlı)
     * @param {Array<object>} rulesA
     * @param {Array<object>} rulesB
     */
    const areRuleSetsEqual = (rulesA = [], rulesB = []) => {
        if (!Array.isArray(rulesA) || !Array.isArray(rulesB)) return false;
        if (rulesA.length !== rulesB.length) return false;
        const countMap = new Map();
        rulesA.forEach(r => {
            const sig = buildRuleObjectSignature(r);
            countMap.set(sig, (countMap.get(sig) || 0) + 1);
        });
        for (const r of rulesB) {
            const sig = buildRuleObjectSignature(r);
            const c = countMap.get(sig) || 0;
            if (c === 0) return false;
            countMap.set(sig, c - 1);
        }
        for (const v of countMap.values()) { if (v !== 0) return false; }
        return true;
    };

    /**
     * Bir kural satırının tamamen boş olup olmadığını (tüm alanların varsayılan değerlerde olup olmadığını) kontrol eder.
     * Boş satırlar kopya kontrolünden muaf tutulur.
     * @param {jQuery} $row - Kontrol edilecek tablo satırı (<tr>).
     * @returns {boolean} - Satır tamamen boşsa true, aksi takdirde false.
     */
    const isRowCompletelyEmpty = ($row) => {
        const category = $row.find('.knsdd-rule-category').val();
        const products = $row.find('.knsdd-rule-product').val() || [];
        const min = $row.find('.knsdd-rule-min').val();
        const max = $row.find('.knsdd-rule-max').val();
        const loginRequired = $row.find('.knsdd-rule-login-required').is(':checked');
        const firstOrderOnly = $row.find('.knsdd-rule-first-order').is(':checked');
        const allowedCustomers = $row.find('.knsdd-customer-select').val() || [];
        const ruleData = $row.data('ruleData') || {};
        const ruleType = ruleData.rule_type || 'standard_discount';

        const isBaseEmpty = (!category || category === '') &&
            products.length === 0 &&
            (!min || Number(min) === 0) &&
            (!max || Number(max) === 0) &&
            !loginRequired &&
            !firstOrderOnly &&
            allowedCustomers.length === 0;

        if (!isBaseEmpty) {
            return false;
        }

        if (ruleType === 'special_campaign') {
            const rd = $row.data('ruleData') || {};
            const hasCampaign = (rd.campaign_type && rd.campaign_type !== '') ||
                (rd.buy_x && Number(rd.buy_x) > 0) ||
                (rd.pay_y && Number(rd.pay_y) > 0) ||
                (rd.trigger_products && rd.trigger_products.length > 0) ||
                (rd.target_products && rd.target_products.length > 0) ||
                (rd.trigger_category && rd.trigger_category !== '') ||
                (rd.target_category && rd.target_category !== '');
            return !hasCampaign;
        } else {
            const dv = $row.find('.knsdd-rule-discount-value').val();
            return (!dv || Number(dv) === 0);
        }
    };

    // Dışarıya açılacak fonksiyonlar
    return {
        buildRowSignature: buildRowSignature,
        isRowCompletelyEmpty: isRowCompletelyEmpty,
        buildRuleObjectSignature: buildRuleObjectSignature,
        areRuleSetsEqual: areRuleSetsEqual
    };

})();
