// =============================================
// notifications.js
// ضعه في: /admin/notifications.js
// أو انسخ محتواه داخل <script> في orders.php
// =============================================

(function() {
    'use strict';

    // ===== إعدادات =====
    var POLL_INTERVAL = 30000;   // كل 30 ثانية
    var SW_PATH       = '/admin/sw.js';   // مسار Service Worker
    var CHECK_URL     = 'check_new_orders.php';

    var lastKnownId   = parseInt(localStorage.getItem('last_order_id') || window.__lastOrderId || '0');
    var swRegistration = null;
    var pollTimer      = null;
    var toastTimer     = null;
    var notifEnabled   = false;

    // ===== تسجيل Service Worker =====
    function registerSW() {
        if (!('serviceWorker' in navigator)) {
            console.warn('Service Workers غير مدعوم في هذا المتصفح');
            return Promise.reject('no-sw');
        }
        return navigator.serviceWorker.register(SW_PATH, { scope: '/admin/' })
            .then(function(reg) {
                swRegistration = reg;
                console.log('✅ Service Worker مُسجَّل:', reg.scope);
                return reg;
            });
    }

    // ===== طلب إذن الإشعارات =====
    function requestPermission() {
        if (!('Notification' in window)) {
            console.warn('الإشعارات غير مدعومة');
            return Promise.resolve('unsupported');
        }
        if (Notification.permission === 'granted') {
            notifEnabled = true;
            return Promise.resolve('granted');
        }
        if (Notification.permission === 'denied') {
            showPermissionBanner('denied');
            return Promise.resolve('denied');
        }
        // اطلب الإذن
        return Notification.requestPermission().then(function(perm) {
            notifEnabled = (perm === 'granted');
            if (perm === 'denied') showPermissionBanner('denied');
            if (perm === 'granted') showPermissionBanner('granted');
            return perm;
        });
    }

    // ===== إظهار إشعار عبر Service Worker (أفضل) أو مباشرة =====
    function showBrowserNotification(data) {
        if (!notifEnabled) return;

        var title   = data.title || '🛒 طلب جديد!';
        var options = {
            body:             data.body || 'تم استلام طلب جديد',
            icon:             '/admin/images/icon-192.png',
            badge:            '/admin/images/badge-72.png',
            tag:              'new-order-' + (data.orderId || Date.now()),
            renotify:         true,
            requireInteraction: true,
            vibrate:          [200, 100, 200, 100, 300],
            dir:              'rtl',
            lang:             'ar',
            data:             { url: data.url || '/admin/orders.php' }
        };

        if (swRegistration && swRegistration.active) {
            // الأفضل - عبر Service Worker (يظهر حتى لو الصفحة مغلقة)
            swRegistration.showNotification(title, options);
        } else {
            // بديل مباشر
            var n = new Notification(title, options);
            n.onclick = function() {
                window.focus();
                n.close();
            };
        }
    }

    // ===== صوت الإشعار =====
    function playNotifSound() {
        try {
            var ctx = new (window.AudioContext || window.webkitAudioContext)();
            var notes = [
                { freq: 880,  start: 0,    dur: 0.15 },
                { freq: 1100, start: 0.15, dur: 0.15 },
                { freq: 1320, start: 0.30, dur: 0.20 },
                { freq: 1100, start: 0.50, dur: 0.15 },
                { freq: 1320, start: 0.65, dur: 0.30 }
            ];
            notes.forEach(function(n) {
                var osc = ctx.createOscillator();
                var g   = ctx.createGain();
                osc.connect(g); g.connect(ctx.destination);
                osc.type = 'sine';
                osc.frequency.value = n.freq;
                g.gain.setValueAtTime(0.3, ctx.currentTime + n.start);
                g.gain.exponentialRampToValueAtTime(0.001, ctx.currentTime + n.start + n.dur);
                osc.start(ctx.currentTime + n.start);
                osc.stop(ctx.currentTime + n.start + n.dur + 0.05);
            });
        } catch(e) {}
    }

    // ===== Toast (داخل الصفحة) =====
    function showToast(data) {
        var toast = document.getElementById('notif-toast');
        var msgEl = document.getElementById('toast-msg');
        if (!toast || !msgEl) return;

        msgEl.textContent = data.body || 'وصل طلب جديد';

        // عنوان
        var titleEl = toast.querySelector('.toast-title');
        if (titleEl) titleEl.textContent = data.title || '🛒 طلب جديد!';

        // إعادة تشغيل الأنيميشن
        toast.style.display = 'none';
        void toast.offsetWidth;
        toast.style.display = 'block';

        // progress bar
        var prog = toast.querySelector('.toast-progress');
        if (prog) {
            prog.style.animation = 'none';
            void prog.offsetWidth;
            prog.style.animation = 'toastProgress 6s linear forwards';
        }

        // bell animation
        var icon = toast.querySelector('.toast-icon');
        if (icon) {
            icon.style.animation = 'none';
            void icon.offsetWidth;
            icon.style.animation = 'ringBell 1s ease 0.3s';
        }

        // صوت
        playNotifSound();

        // اغلاق تلقائي
        clearTimeout(toastTimer);
        toastTimer = setTimeout(dismissToast, 7000);
    }

    window.dismissToast = function() {
        var t = document.getElementById('notif-toast');
        if (!t) return;
        t.style.transition = 'opacity 0.3s,transform 0.3s';
        t.style.opacity = '0';
        t.style.transform = 'translateX(-20px)';
        setTimeout(function() {
            t.style.display = 'none';
            t.style.opacity = '';
            t.style.transform = '';
            t.style.transition = '';
        }, 320);
        clearTimeout(toastTimer);
    };

    // ===== Polling - فحص الطلبات الجديدة =====
    function checkNewOrders() {
        fetch(CHECK_URL + '?last_id=' + lastKnownId + '&_=' + Date.now())
            .then(function(r) { return r.json(); })
            .then(function(data) {
                if (data.error) return;

                if (data.new_count > 0 && data.notification) {
                    // 1) إشعار المتصفح الحقيقي
                    showBrowserNotification(data.notification);

                    // 2) Toast داخل الصفحة
                    showToast(data.notification);

                    // 3) تحديث عداد اليوم
                    var todayEl = document.getElementById('stat-today');
                    if (todayEl && data.today_count !== undefined) {
                        todayEl.textContent = data.today_count;
                        animateStat(todayEl);
                    }

                    // 4) تحديث lastKnownId
                    lastKnownId = data.latest_id;
                    localStorage.setItem('last_order_id', lastKnownId);
                }
            })
            .catch(function() { /* صمت عند فشل الشبكة */ });
    }

    function animateStat(el) {
        el.style.transform = 'scale(1.4)';
        el.style.color = '#F59E0B';
        el.style.transition = 'all 0.3s';
        setTimeout(function() {
            el.style.transform = '';
            el.style.color = '';
        }, 600);
    }

    // ===== بانر طلب الإذن =====
    function showPermissionBanner(state) {
        var existing = document.getElementById('notif-banner');
        if (existing) existing.remove();

        if (state === 'granted') {
            var banner = createBanner(
                'success',
                '✅ تم تفعيل إشعارات المتصفح! ستصلك إشعارات فورية عند كل طلب جديد.',
                null
            );
            document.body.prepend(banner);
            setTimeout(function() { if (banner.parentNode) banner.remove(); }, 5000);
            return;
        }

        if (state === 'denied') {
            var banner = createBanner(
                'warning',
                '⚠️ تم رفض الإشعارات. لتفعيلها: اضغط أيقونة القفل في شريط العنوان ← الإشعارات ← سماح',
                null
            );
            document.body.prepend(banner);
            return;
        }

        // اطلب الإذن
        var banner = createBanner(
            'info',
            '🔔 فعّل إشعارات المتصفح لتصلك تنبيهات فورية عند كل طلب جديد — حتى لو الصفحة مغلقة!',
            function() {
                requestPermission().then(function() {
                    var b = document.getElementById('notif-banner');
                    if (b) b.remove();
                });
            }
        );
        document.body.prepend(banner);
    }

    function createBanner(type, text, onAction) {
        var colors = {
            info:    { bg:'#EFF6FF', border:'#BFDBFE', color:'#1E40AF', btnBg:'#1E40AF' },
            success: { bg:'#D1FAE5', border:'#A7F3D0', color:'#065F46', btnBg:'#059669' },
            warning: { bg:'#FEF3C7', border:'#FDE68A', color:'#92400E', btnBg:'#D97706' }
        };
        var c = colors[type] || colors.info;

        var div = document.createElement('div');
        div.id = 'notif-banner';
        div.style.cssText = [
            'position:fixed', 'top:0', 'left:0', 'right:0', 'z-index:9999',
            'background:' + c.bg, 'border-bottom:2px solid ' + c.border,
            'color:' + c.color, 'padding:12px 20px',
            'display:flex', 'align-items:center', 'justify-content:space-between',
            'gap:12px', 'font-family:Tajawal,sans-serif', 'font-size:14px',
            'font-weight:600', 'direction:rtl', 'animation:slideIn 0.3s ease'
        ].join(';');

        var textSpan = document.createElement('span');
        textSpan.textContent = text;

        var btns = document.createElement('div');
        btns.style.cssText = 'display:flex;gap:8px;flex-shrink:0';

        if (onAction) {
            var actionBtn = document.createElement('button');
            actionBtn.textContent = '🔔 تفعيل الإشعارات';
            actionBtn.style.cssText = 'background:' + c.btnBg + ';color:white;border:none;padding:8px 16px;border-radius:8px;font-weight:700;cursor:pointer;font-family:Tajawal,sans-serif;font-size:13px';
            actionBtn.onclick = onAction;
            btns.appendChild(actionBtn);
        }

        var closeBtn = document.createElement('button');
        closeBtn.innerHTML = '&times;';
        closeBtn.style.cssText = 'background:none;border:none;font-size:22px;cursor:pointer;color:' + c.color + ';padding:0;line-height:1;font-weight:700';
        closeBtn.onclick = function() { div.remove(); };
        btns.appendChild(closeBtn);

        div.appendChild(textSpan);
        div.appendChild(btns);
        return div;
    }

    // ===== زر تفعيل الإشعارات (يُضاف في الـ header) =====
    function addNotifButton() {
        var header = document.querySelector('.header .filter-buttons');
        if (!header) return;
        if (document.getElementById('notif-toggle-btn')) return;

        var btn = document.createElement('button');
        btn.id = 'notif-toggle-btn';
        btn.className = 'btn';
        btn.style.cssText = 'background:#F59E0B;color:white;border:none';
        btn.title = 'تفعيل إشعارات المتصفح';
        updateNotifButton(btn);

        btn.onclick = function() {
            if (Notification.permission === 'granted') {
                // اختبار إشعار
                showBrowserNotification({
                    title: '✅ الإشعارات تعمل!',
                    body:  'ستصلك إشعارات فورية عند وصول طلبات جديدة',
                    orderId: null,
                    url: '/admin/orders.php'
                });
            } else {
                requestPermission();
            }
        };

        header.appendChild(btn);
    }

    function updateNotifButton(btn) {
        if (!btn) btn = document.getElementById('notif-toggle-btn');
        if (!btn) return;

        var perm = ('Notification' in window) ? Notification.permission : 'unsupported';

        if (perm === 'granted') {
            btn.innerHTML = '<i class="fas fa-bell"></i> إشعارات مفعّلة';
            btn.style.background = '#059669';
            btn.title = 'اضغط لاختبار الإشعار';
        } else if (perm === 'denied') {
            btn.innerHTML = '<i class="fas fa-bell-slash"></i> إشعارات محجوبة';
            btn.style.background = '#DC2626';
            btn.title = 'الإشعارات محجوبة - افتح إعدادات المتصفح';
        } else {
            btn.innerHTML = '<i class="fas fa-bell"></i> فعّل الإشعارات';
            btn.style.background = '#F59E0B';
            btn.title = 'اضغط لتفعيل إشعارات المتصفح';
        }
    }

    // ===== تهيئة كل شيء =====
    function init() {
        // حفظ آخر ID
        if (window.__lastOrderId) {
            localStorage.setItem('last_order_id', window.__lastOrderId);
            lastKnownId = window.__lastOrderId;
        }

        // تسجيل SW + طلب الإذن
        if ('serviceWorker' in navigator && 'Notification' in window) {
            registerSW()
                .then(function() {
                    if (Notification.permission === 'default') {
                        // انتظر 2 ثانية قبل طلب الإذن
                        setTimeout(function() {
                            showPermissionBanner('ask');
                        }, 2000);
                    } else if (Notification.permission === 'granted') {
                        notifEnabled = true;
                    }
                })
                .catch(function() {
                    // SW فشل - استخدم الإشعار المباشر
                    if (Notification.permission === 'default') {
                        setTimeout(function() { showPermissionBanner('ask'); }, 2000);
                    } else {
                        notifEnabled = Notification.permission === 'granted';
                    }
                });
        }

        // إضافة زر التفعيل في الهيدر
        addNotifButton();

        // بدء الـ polling
        pollTimer = setInterval(checkNewOrders, POLL_INTERVAL);

        // فحص فوري بعد 3 ثوان من التحميل
        setTimeout(checkNewOrders, 3000);
    }

    // ابدأ عند اكتمال DOM
    if (document.readyState === 'loading') {
        document.addEventListener('DOMContentLoaded', init);
    } else {
        init();
    }

})();