/**
 * KNSDD Select2 Yardımcı Fonksiyonlar
 * 
 * Bu modül, Select2 ile ilgili ortak fonksiyonları merkezi bir yerde toplar.
 * render.js ve modals.js dosyalarında kod tekrarını önlemek için oluşturulmuştur.
 * 
 * @namespace KNSDDSelect2
 */
window.KNSDDSelect2 = (function($) {
    'use strict';

    // --- Dropdown Adapter Cache (modül kapsamı) ---
    // Select2'nin AMD modüllerinden oluşturulan dropdownAdapter'ı bir kez hesaplayıp
    // tüm satırlarda paylaşırız. AMD bulunmazsa undefined olarak cache'lenir ve
    // inline arama davranışına otomatik düşülür.
    let __knsddS2DropdownAdapter = null; // null: hesaplanmadı, undefined: bulunamadı
    
    /**
     * Select2 Dropdown Adapter'ı döndürür (cache'li)
     * @returns {Object|undefined} Dropdown adapter veya undefined
     */
    const getS2DropdownAdapter = () => {
        if (__knsddS2DropdownAdapter !== null) { return __knsddS2DropdownAdapter; }
        try {
            if (!jQuery.fn || !jQuery.fn.select2 || !jQuery.fn.select2.amd) { 
                __knsddS2DropdownAdapter = undefined; 
                return __knsddS2DropdownAdapter; 
            }
            const Utils = jQuery.fn.select2.amd.require('select2/utils');
            const Dropdown = jQuery.fn.select2.amd.require('select2/dropdown');
            const DropdownSearch = jQuery.fn.select2.amd.require('select2/dropdown/search');
            const AttachBody = jQuery.fn.select2.amd.require('select2/dropdown/attachBody');
            const WithSearch = Utils.Decorate(Dropdown, DropdownSearch);
            __knsddS2DropdownAdapter = Utils.Decorate(WithSearch, AttachBody);
        } catch(_e) {
            __knsddS2DropdownAdapter = undefined;
        }
        return __knsddS2DropdownAdapter;
    };

    /**
     * HTML özel karakterlerini kaçış karakterine çevirir
     * @param {string} s - Kaçış yapılacak string
     * @returns {string} Güvenli HTML string
     */
    const escapeHtml = (s) => {
        if (s === null || typeof s === 'undefined') return '';
        return String(s)
            .replace(/&/g, '&amp;')
            .replace(/</g, '&lt;')
            .replace(/>/g, '&gt;');
    };

    /**
     * Select2 dropdown'daki ürün seçeneklerini formatlar (sonuç listesi)
     * @param {Object} data - Select2 data objesi
     * @returns {string} HTML formatlanmış ürün seçeneği
     */
    const formatProductOption = (data) => {
        if (!data || !data.id) { 
            return data && data.text ? escapeHtml(data.text) : ''; 
        }
        const thumb = data.thumb || '';
        const sku   = data.sku || '';
        const status = data.stock_status || '';
        const qty    = (data.manage_stock && (typeof data.stock_qty === 'number')) ? data.stock_qty : null;
        const dotCls = status === 'instock' ? 's-instock' : (status === 'onbackorder' ? 's-onbackorder' : (status === 'outofstock' ? 's-outofstock' : ''));
        const statusLbl = (() => {
            const i18n = (typeof knsdd_data !== 'undefined' && knsdd_data.i18n) ? knsdd_data.i18n : {};
            if (status === 'instock') return i18n.s2_status_instock_tip || i18n.s2_status_instock || 'Stokta';
            if (status === 'onbackorder') return i18n.s2_status_onbackorder_tip || i18n.s2_status_onbackorder || 'Tedarikte — Sipariş verilebilir';
            if (status === 'outofstock') return i18n.s2_status_outofstock_tip || i18n.s2_status_outofstock || 'Stokta yok — Satış kapalı';
            return '';
        })();
        const dot = `<span class="knsdd-s2-dot ${dotCls}" title="${escapeHtml(statusLbl)}" aria-label="${escapeHtml(statusLbl)}"></span>`;
        const qtyTip = (typeof knsdd_data !== 'undefined' && knsdd_data.i18n && knsdd_data.i18n.s2_stock_qty_tip) ? knsdd_data.i18n.s2_stock_qty_tip : 'Stok miktarı';
        const qtyHtml = (qty !== null && !isNaN(qty)) ? `<span class="knsdd-s2-qty" title="${escapeHtml(qtyTip)}">(${qty})</span>` : '';
        return (
            `<div class="knsdd-s2-option">`
            + (thumb ? `<img class="knsdd-s2-thumb" src="${escapeHtml(thumb)}" alt="">` : '')
            + `<div class="knsdd-s2-text">`
            +   `<div class="knsdd-s2-title">${escapeHtml(data.text)}</div>`
            +   (sku ? `<div class="knsdd-s2-sku">${escapeHtml(sku)}</div>` : '')
            + `</div>`
            + `<div class="knsdd-s2-meta">${dot}${qtyHtml}</div>`
            + `</div>`
        );
    };

    /**
     * Select2'de seçili ürünleri formatlar (chip görünümü)
     * @param {Object} data - Select2 data objesi
     * @returns {string} HTML formatlanmış seçili ürün chip'i
     */
    const formatProductSelection = (data) => {
        // Çip görünümü: ad + (varsa) durum noktası ve stok adedi. SKU çipte yok; title içinde Ad — SKU.
        if (!data || !data.id) { 
            return escapeHtml(data && data.text ? data.text : ''); 
        }
        let sku = data.sku || '';
        if (!sku && data.element) {
            sku = jQuery(data.element).attr('data-sku') || '';
        }
        // Stok bilgilerini hem data'dan hem option data-*'dan toparla
        let status = data.stock_status || '';
        if (!status && data.element) { 
            status = jQuery(data.element).attr('data-stock-status') || ''; 
        }
        let mstock = (typeof data.manage_stock !== 'undefined') ? !!data.manage_stock : undefined;
        if (typeof mstock === 'undefined' && data.element) {
            const msAttr = jQuery(data.element).attr('data-manage-stock');
            mstock = (msAttr === '1' || msAttr === 'true');
        }
        let qty = (typeof data.stock_qty !== 'undefined') ? data.stock_qty : undefined;
        if (typeof qty === 'undefined' && data.element) {
            const qAttr = jQuery(data.element).attr('data-stock-qty');
            if (typeof qAttr !== 'undefined') {
                const n = Number(qAttr);
                qty = Number.isNaN(n) ? null : n;
            }
        }
        const dotCls = status === 'instock' ? 's-instock' : (status === 'onbackorder' ? 's-onbackorder' : (status === 'outofstock' ? 's-outofstock' : ''));
        const statusLbl = (() => {
            const i18n = (typeof knsdd_data !== 'undefined' && knsdd_data.i18n) ? knsdd_data.i18n : {};
            if (status === 'instock') return i18n.s2_status_instock_tip || i18n.s2_status_instock || 'Stokta';
            if (status === 'onbackorder') return i18n.s2_status_onbackorder_tip || i18n.s2_status_onbackorder || 'Tedarikte — Sipariş verilebilir';
            if (status === 'outofstock') return i18n.s2_status_outofstock_tip || i18n.s2_status_outofstock || 'Stokta yok — Satış kapalı';
            return '';
        })();
        const qtyTip = (typeof knsdd_data !== 'undefined' && knsdd_data.i18n && knsdd_data.i18n.s2_stock_qty_tip) ? knsdd_data.i18n.s2_stock_qty_tip : 'Stok miktarı';
        const qtyHtml = (mstock && qty !== null && typeof qty !== 'undefined' && !isNaN(Number(qty)))
            ? `<span class="knsdd-s2-qty" title="${escapeHtml(qtyTip)}">(${Number(qty)})</span>`
            : '';

        const title = sku ? `${data.text} — ${sku}` : `${data.text}`;
        return (
            `<span class="knsdd-s2-chip" title="${escapeHtml(title)}">`
            + `<span class="knsdd-s2-chip-text">${escapeHtml(data.text)}</span>`
            + `<span class="knsdd-s2-chip-meta">`
            +   (dotCls ? `<span class=\"knsdd-s2-dot ${dotCls}\" title=\"${escapeHtml(statusLbl)}\" aria-label=\"${escapeHtml(statusLbl)}\"></span>` : '')
            +   `${qtyHtml}`
            + `</span>`
            + `</span>`
        );
    };

    /**
     * Select2 arama odak yönetimi (seçim sonrası aramayı temizle ve odakla)
     * @param {jQuery} $select - Select2 elementi
     */
    const attachSelect2SearchHandlers = ($select) => {
        $select.on('select2:select', function() {
            // closeOnSelect=false olsa bile bazı temalarda kapanabildiğinden güvence için
            jQuery(this).select2('open');
            const $search = jQuery('.select2-container--open .select2-search__field');
            $search.val('').trigger('focus');
        });
        $select.on('select2:open', () => {
            const $search = jQuery('.select2-container--open .select2-search__field');
            $search.trigger('focus');
        });
    };

    /**
     * Clear button durumunu yönetir (seçim varsa aktif, yoksa devre dışı)
     * @param {jQuery} $btn - Clear butonu
     * @param {jQuery} $select - Select2 elementi
     */
    const setClearButtonState = ($btn, $select) => {
        try {
            const values = ($select.val() || []);
            const hasSelection = Array.isArray(values) ? values.length > 0 : !!values;
            const isSelectDisabled = $select.is(':disabled');
            const disabled = isSelectDisabled || !hasSelection;
            $btn.prop('disabled', disabled).attr('aria-disabled', disabled ? 'true' : 'false');
            // Görünürlük: seçim yoksa veya select devre dışıysa tamamen gizle
            if (!hasSelection || isSelectDisabled) {
                $btn.addClass('is-disabled is-hidden');
            } else {
                $btn.removeClass('is-disabled is-hidden');
            }
        } catch(_e) {}
    };

    /**
     * Select2 remove (X) butonlarına Türkçe tooltip/aria-label ekler
     * @param {jQuery} $select - Select2 elementi
     */
    const applyS2RemoveLabels = ($select) => {
        try {
            const label = knsdd_data.i18n && knsdd_data.i18n.s2_remove_item ? knsdd_data.i18n.s2_remove_item : 'Kaldır';
            const $container = $select.data('select2') && $select.data('select2').$container ? $select.data('select2').$container : null;
            if (!$container) return;
            $container.find('.select2-selection__choice__remove').attr('title', label).attr('aria-label', label);
        } catch(_e){}
    };

    /**
     * Select2 clear butonuna Türkçe tooltip/aria-label ekler
     * @param {jQuery} $select - Select2 elementi
     */
    const applyS2ClearLabel = ($select) => {
        try {
            const label = knsdd_data.i18n && knsdd_data.i18n.s2_clear_selection ? knsdd_data.i18n.s2_clear_selection : 'Seçimi temizle';
            const $container = $select.data('select2') && $select.data('select2').$container ? $select.data('select2').$container : null;
            if (!$container) return;
            $container.find('.select2-selection__clear').attr('title', label).attr('aria-label', label);
        } catch(_e){}
    };

    /**
     * HTML entity decode (Select2 AJAX sonuçları için)
     * @param {string} txt - Decode edilecek metin
     * @returns {string} Decode edilmiş metin
     */
    const decodeHtmlEntities = (txt) => {
        if (!txt) return txt;
        const $t = jQuery('<textarea/>');
        $t.html(txt);
        return $t.text();
    };

    /**
     * Stock quantity parse (string/null → number/null)
     * @param {*} qty - Parse edilecek stok miktarı
     * @returns {number|null} Sayısal stok miktarı veya null
     */
    const parseStockQuantity = (qty) => {
        if (qty === '' || qty === null || typeof qty === 'undefined') {
            return null;
        }
        const n = Number(qty);
        return Number.isNaN(n) ? null : n;
    };

    /**
     * Select2 AJAX processResults (standart ürün arama)
     * @param {Object} data - AJAX response data
     * @returns {Object} Select2 results objesi
     */
    const processProductResults = (data) => {
        const results = (data && data.data && Array.isArray(data.data.results))
            ? data.data.results.map(item => ({
                id: item.id,
                text: decodeHtmlEntities(item.text),
                thumb: item.thumb || '',
                sku: item.sku || '',
                stock_status: item.stock_status || '',
                manage_stock: !!item.manage_stock,
                stock_qty: parseStockQuantity(item.stock_qty)
            }))
            : [];
        return { results: results };
    };

    // Public API
    return {
        getS2DropdownAdapter: getS2DropdownAdapter,
        escapeHtml: escapeHtml,
        formatProductOption: formatProductOption,
        formatProductSelection: formatProductSelection,
        attachSelect2SearchHandlers: attachSelect2SearchHandlers,
        setClearButtonState: setClearButtonState,
        applyS2RemoveLabels: applyS2RemoveLabels,
        applyS2ClearLabel: applyS2ClearLabel,
        decodeHtmlEntities: decodeHtmlEntities,
        parseStockQuantity: parseStockQuantity,
        processProductResults: processProductResults
    };

})(jQuery);
