// Biz Connect service worker — NOTIFICATIONS ONLY.
// Intentionally has NO 'fetch' handler and NO caching, so it can never serve a stale
// version of the app. Its only job is to show push notifications when the page is in
// the background / frozen / closed, and to open the right chat when one is clicked.
self.addEventListener('install', (e) => { self.skipWaiting(); });
self.addEventListener('activate', (e) => { e.waitUntil(self.clients.claim()); });
// No-op fetch handler: present only so the app meets PWA installability criteria. It never
// calls respondWith(), so the browser performs its normal network fetch — NO caching, so this
// can never serve a stale app.
self.addEventListener('fetch', () => {});

self.addEventListener('push', (event) => {
  let d = {};
  try { d = event.data ? event.data.json() : {}; } catch (_) {}
  const title = d.title || 'Biz Connect';
  const options = {
    body: d.body || '',
    icon: d.icon || '/icon-192.png',  // sender/group DP when the server provides one, else brand icon (not the old wordmark)
    badge: '/icon-192.png',
    tag: d.tag || undefined,        // collapse repeats from the same chat
    renotify: !!d.tag,
    data: { kind: d.kind || '', id: d.id || '' },
  };
  event.waitUntil((async () => {
    // If a BizGaze tab is currently VISIBLE, the page itself alerts the user (ping / in-page
    // popup) — skip the OS popup to avoid a double. Only show when no tab is visible
    // (another tab/app, minimized, or closed) — exactly when the page can't alert.
    const clientsArr = await self.clients.matchAll({ type: 'window', includeUncontrolled: true });
    const visible = clientsArr.some((c) => c.visibilityState === 'visible');
    if (visible) return;
    await self.registration.showNotification(title, options);
  })());
});

self.addEventListener('notificationclick', (event) => {
  event.notification.close();
  const { kind, id } = event.notification.data || {};
  const url = '/home' + (id ? ('?openKind=' + encodeURIComponent(kind || 'dm') + '&openId=' + encodeURIComponent(id)) : '');
  event.waitUntil((async () => {
    const all = await self.clients.matchAll({ type: 'window', includeUncontrolled: true });
    for (const c of all) {
      if (c.url.includes('/home')) { try { await c.focus(); c.postMessage({ type: 'open-chat', kind, id }); return; } catch (_) {} }
    }
    try { await self.clients.openWindow(url); } catch (_) {}
  })());
});
