// 사이니지 플레이어 서비스 워커 — 오프라인 재생 안정성
// 서버가 잠깐 꺼지거나(자동 재시작 중) 네트워크가 끊겨도, 이미 캐시된 플레이어 화면과
// 이미지(포스터)를 계속 띄울 수 있도록 앱 셸과 이미지 미디어를 캐시한다.
const SHELL_CACHE = 'sig-shell-v2';
const MEDIA_CACHE = 'sig-media-v1';
const SHELL = ['/player/', '/player/index.html', '/player/player.js', '/shared/engine.js', '/shared/zoneplayer.js'];

self.addEventListener('install', (e) => {
  e.waitUntil(caches.open(SHELL_CACHE).then((c) => c.addAll(SHELL)).then(() => self.skipWaiting()).catch(() => self.skipWaiting()));
});

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

self.addEventListener('fetch', (e) => {
  const req = e.request;
  if (req.method !== 'GET') return;
  const url = new URL(req.url);
  if (url.origin !== location.origin) return; // 외부(유튜브 등)는 관여하지 않음
  if (url.pathname === '/ws') return;

  // 미디어: 네트워크 우선, 이미지는 캐시(오프라인 대비). 영상은 캐시하지 않음(Range 스트리밍).
  if (url.pathname.startsWith('/media/') || url.pathname.startsWith('/api/stream/')) {
    e.respondWith((async () => {
      try {
        const res = await fetch(req);
        const ct = res.headers.get('content-type') || '';
        if (res.ok && ct.startsWith('image/')) {
          const c = await caches.open(MEDIA_CACHE);
          c.put(req, res.clone()).catch(() => {});
        }
        return res;
      } catch {
        const hit = await caches.match(req);
        return hit || Response.error();
      }
    })());
    return;
  }

  // API(상태 등)는 항상 네트워크
  if (url.pathname.startsWith('/api/')) return;

  // 앱 셸/정적 자원: 네트워크 우선, 실패 시 캐시 → 서버가 꺼져도 플레이어가 로드됨
  e.respondWith((async () => {
    try {
      const res = await fetch(req);
      if (res.ok) { const c = await caches.open(SHELL_CACHE); c.put(req, res.clone()).catch(() => {}); }
      return res;
    } catch {
      const hit = await caches.match(req);
      return hit || caches.match('/player/index.html');
    }
  })());
});
