// سودانا Service Worker v14
// CACHE_NAME يتضمن timestamp التشغيل — يُجبر المتصفح على تحديث الكاش
// عند رفع sw.js جديد، غيّر هذا الرقم
const CACHE_VERSION = 'v14.1';
const CACHE_NAME    = 'sudanna-' + CACHE_VERSION;
const OFFLINE_URL   = '/offline.html';

// الملفات الأساسية للـ Pre-cache
// FIX BUG 9: لا نخزّن '/' لأنه يحتوي حالة تسجيل الدخول
// نخزّن الملفات الثابتة فقط
const PRE_CACHE = [
  '/manifest.json',
  '/icon-192.png',
  '/icon-512.png',
  '/offline.html',
  '/inference-engine.js',
];

// ── Install: تخزين الملفات الأساسية ────────────────────────────
self.addEventListener('install', e => {
  e.waitUntil(
    caches.open(CACHE_NAME)
      .then(cache => cache.addAll(PRE_CACHE).catch(err => console.warn('[SW] pre-cache error:', err)))
      .then(() => self.skipWaiting())
  );
});

// ── Activate: حذف الكاشات القديمة ──────────────────────────────
// إشعار كل التبويبات المفتوحة عند تفعيل Service Worker جديد
self.addEventListener('message', e => {
  if (e.data && e.data.type === 'SKIP_WAITING') {
    self.skipWaiting();
  }
});

self.addEventListener('activate', e => {
  e.waitUntil(
    caches.keys()
      .then(keys => Promise.all(keys.filter(k => k !== CACHE_NAME).map(k => caches.delete(k))))
      .then(() => self.clients.claim())
  );
});

// ── Fetch: استراتيجية ذكية للتخزين ─────────────────────────────
self.addEventListener('fetch', e => {
  const req = e.request;
  const url = new URL(req.url);

  // تجاهل الطلبات الخارجية وغير GET
  if (url.origin !== self.location.origin) return;
  if (req.method !== 'GET') return;

  // API: دائماً من الشبكة (بدون cache)
  if (url.pathname.startsWith('/api/') || url.pathname.startsWith('/admin')) return;

  // الملفات الثابتة: Cache First
  if (url.pathname.match(/\.(png|jpg|jpeg|webp|gif|css|js|woff2|woff|ttf|svg|ico)$/)) {
    e.respondWith(
      caches.match(req).then(cached => {
        if (cached) return cached;
        return fetch(req).then(res => {
          if (res && res.status === 200) {
            const clone = res.clone();
            caches.open(CACHE_NAME).then(c => c.put(req, clone));
          }
          return res;
        }).catch(() => cached || new Response('', { status: 404 }));
      })
    );
    return;
  }

  // الصفحات: Network First مع Offline fallback
  e.respondWith(
    fetch(req)
      .then(res => {
        if (res && res.status === 200) {
          const toCache = res.clone();
          caches.open(CACHE_NAME).then(c => c.put(req, toCache));
        }
        return res;
      })
      .catch(async () => {
        const cached = await caches.match(req);
        if (cached) return cached;
        // صفحة Offline للصفحات HTML
        if (req.headers.get('Accept')?.includes('text/html')) {
          return caches.match(OFFLINE_URL) || caches.match('/index.html');
        }
        return new Response('', { status: 503 });
      })
  );
});

// ── Push Notifications ──────────────────────────────────────────
self.addEventListener('push', e => {
  let d = { title: 'سودانا 🇸🇩', body: 'إشعار جديد', url: '/', tag: 'sudanna', urgent: false };

  try {
    if (e.data) {
      const p = e.data.json();
      d.title  = p.notification?.title  || d.title;
      d.body   = p.notification?.body   || d.body;
      d.url    = p.data?.url            || '/';
      d.tag    = p.data?.tag            || 'sudanna';
      d.urgent = p.data?.tag === 'urgent' || p.data?.tag === 'medication_radar';
    }
  } catch {}

  const opts = {
    body:             d.body,
    icon:             '/icon-192.png',
    badge:            '/icon-192.png',
    tag:              d.tag,
    data:             { url: d.url },
    dir:              'rtl',
    lang:             'ar',
    requireInteraction: d.urgent,
    vibrate:          d.urgent ? [400, 100, 400, 100, 400] : [100, 50, 100],
  };

  e.waitUntil(self.registration.showNotification(d.title, opts));
});

// ── Notification Click ──────────────────────────────────────────
self.addEventListener('notificationclick', e => {
  e.notification.close();
  const url = e.notification.data?.url || '/';
  e.waitUntil(
    clients.matchAll({ type: 'window', includeUncontrolled: true }).then(list => {
      for (const c of list) {
        if (c.url.includes('sudanna.ai') && 'focus' in c) {
          return c.focus().then(() => c.navigate && c.navigate(url));
        }
      }
      return clients.openWindow(url);
    })
  );
});

// ── Push Subscription Change ────────────────────────────────────
self.addEventListener('pushsubscriptionchange', e => {
  e.waitUntil(
    self.registration.pushManager.subscribe(e.oldSubscription.options)
      .then(sub => fetch('/api/auth/save_fcm_token.php', {
        method:  'POST',
        headers: { 'Content-Type': 'application/json' },
        body:    JSON.stringify({ fcm_token: JSON.stringify(sub) }),
      }))
  );
});

// ── Background Sync (للطلبات المؤجلة عند الاتصال) ──────────────
self.addEventListener('sync', e => {
  if (e.tag === 'sync-pending') {
    e.waitUntil(
      self.clients.matchAll().then(clients =>
        clients.forEach(c => c.postMessage({ type: 'SYNC_READY' }))
      )
    );
  }
});
