/**
 * save_guard.js — حماية شاملة من الضغط المزدوج على أزرار الحفظ
 * يُطبق على جميع أزرار الحفظ في النظام بعد تحميل كل الوحدات
 * المبدأ: عند الضغط → يُعطَّل الزر فوراً → ينتهي العمل → يُعاد تفعيله
 */

(function installSaveGuards() {

    /**
     * يُغلف دالة حدث async بحماية disabled/finally
     * @param {HTMLElement} btn - الزر
     * @param {Function} handler - الدالة الأصلية
     */
    function guard(btn, handler) {
        return async function(e) {
            if (btn.disabled) return;           // منع الضغط المزدوج
            btn.disabled = true;
            const originalText = btn.innerHTML;
            btn.innerHTML = `<span style="opacity:0.7">${originalText}</span> ⏳`;
            try {
                await handler.call(this, e);
            } finally {
                btn.disabled = false;
                btn.innerHTML = originalText;
            }
        };
    }

    /**
     * يبحث عن زر بالـ ID ويُطبق عليه الحماية
     * يستبدل الـ listener القديم بواحد محمي
     */
    function applyGuardById(id) {
        const btn = document.getElementById(id);
        if (!btn) return;

        // نسخ الزر لمسح كل الـ listeners القديمة
        const newBtn = btn.cloneNode(true);
        btn.parentNode.replaceChild(newBtn, btn);

        // إعادة تثبيت listener محمي عبر onclick
        // (لأن الـ listeners الأصلية مسجلة بـ addEventListener)
        newBtn._guardApplied = true;
        return newBtn;
    }

    /**
     * يُطبق الحماية على زر يملك listener مسجل بـ addEventListener
     * من خلال اعتراض الحدث قبل وصوله للـ listener الأصلي
     */
    function guardButton(id) {
        const btn = document.getElementById(id);
        if (!btn || btn._guardApplied) return;

        btn._guardApplied = true;

        // نُضيف listener بـ capture=true ليعمل قبل الـ listeners الأخرى
        btn.addEventListener('click', function(e) {
            if (btn.disabled) {
                e.stopImmediatePropagation();
                e.preventDefault();
                return;
            }
            // نُعطِّل الزر فوراً ونُعيد تفعيله بعد حين
            btn.disabled = true;
            const orig = btn.innerHTML;
            btn.innerHTML = `<span style="opacity:0.7">${orig}</span>&nbsp;⏳`;
            // نُعيد التفعيل بعد 15 ثانية كـ fallback لمنع التكرار في حالة بطء الشبكة
            setTimeout(() => {
                btn.disabled = false;
                btn.innerHTML = orig;
            }, 15000);
        }, true /* capture phase */);
    }

    // ========================
    // قائمة كل أزرار الحفظ
    // ========================
    const buttonsToGuard = [
        // أذونات الصرف والاستلام
        'btn-save-invoice',
        // المبيعات والمشتريات
        'btn-save-sales',
        'btn-save-purchases',
        // السندات والتحويلات
        'btn-save-voucher',
        'btn-save-transfer',
        // المرتجعات
        'btn-save-sales-returns',
        'btn-save-purchases-returns',
        // التصنيع
        'btn-save-manufacture',
        // المخازن والجهات والأصناف
        'btn-save-warehouse',
        'btn-save-contact',
        'btn-save-unit',
        'btn-save-item',
        'btn-save-project',
        // المحاسبة
        'btn-save-account',
        'btn-save-journal',
        'btn-save-settlement',
        // العهدة النثرية
        'btn-save-petty-request',
        'btn-save-petty-settlement',
        'btn-approve-settlement',
        // اعتماد المستندات
        'btn-confirm-receipt',
        'btn-execute-decision',
        'btn-approve-storekeeper',
        // المستخلصات
        'btn-save-abstract',
        'btn-save-client-abstract',
        'btn-pay-abstract',
        'btn-pay-client-abstract',
    ];

    // ========================
    // تطبيق الحماية بعد تحميل كل الصفحة
    // ========================
    function install() {
        buttonsToGuard.forEach(id => guardButton(id));

        // حماية إضافية لأزرار HR (تعمل بـ onclick في HTML)
        guardHRButtons();
    }

    // ========================
    // حماية أزرار HR (saveAdvance, savePayroll, executePayPayroll)
    // ========================
    function guardHRButtons() {
        // نبحث عن الأزرار التي تستدعي HRApp.*
        document.querySelectorAll('button[onclick*="HRApp.saveAdvance"], button[onclick*="HRApp.savePayroll"], button[onclick*="HRApp.executePayPayroll"]').forEach(btn => {
            if (btn._guardApplied) return;
            btn._guardApplied = true;
            const origOnclick = btn.getAttribute('onclick');
            btn.onclick = null;
            btn.addEventListener('click', async function(e) {
                if (btn.disabled) return;
                btn.disabled = true;
                const orig = btn.innerHTML;
                btn.innerHTML = `<span style="opacity:0.7">${orig}</span>&nbsp;⏳`;
                try {
                    await eval(origOnclick); // eslint-disable-line no-eval
                } finally {
                    btn.disabled = false;
                    btn.innerHTML = orig;
                }
            });
        });
    }

    // ========================
    // نُفعِّل الحماية بعد تحميل كل الوحدات
    // ========================
    if (document.readyState === 'loading') {
        document.addEventListener('DOMContentLoaded', () => setTimeout(install, 500));
    } else {
        setTimeout(install, 500);
    }

    // نُعيد التطبيق أيضاً عند حدث load (بعد تحميل كل الـ scripts المؤجلة)
    window.addEventListener('load', () => setTimeout(install, 1000));

})();
