/* =====================================================================
   sw.js — minimaler Service Worker für DOGFATHER UNIVERSE
   Zweck: NICHT primär Offline-Funktionalität, sondern die technische
   Voraussetzung, damit Chrome/Edge auf dem Desktop den "App installieren"-
   Prompt zuverlässig anzeigt (Chrome verlangt dafür einen registrierten
   Service Worker mit fetch()-Handler, siehe developer.chrome.com/blog/
   update-install-criteria, Stand 2026). Nebenbei cached er die wichtigsten
   Shell-Dateien, damit die Seite bei Verbindungsabbruch nicht komplett
   leer bleibt — bewusst simpel gehalten (kein Offline-Vollausbau).
   ===================================================================== */

const CACHE_NAME = "dogfather-universe-shell-v1";
const SHELL_ASSETS = [
  "/",
  "/index.html",
  "/assets/css/main.css",
  "/assets/css/theme-dogfather.css",
  "/assets/css/theme-hasidog.css",
  "/assets/css/theme-spicymedia.css",
  "/assets/js/main.js",
  "/assets/img/favicon.png",
  "/assets/img/icon-192.png",
  "/assets/img/icon-512.png",
];

self.addEventListener("install", (event) => {
  event.waitUntil(
    caches
      .open(CACHE_NAME)
      .then((cache) => cache.addAll(SHELL_ASSETS))
      .catch(() => {
        /* Einzelne Assets könnten fehlen (z.B. beim allerersten Deploy) —
           soll die Installation des Service Workers nicht blockieren. */
      })
  );
  self.skipWaiting();
});

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

/* Network-first mit Cache-Fallback: liefert immer die aktuellste Version,
   greift nur bei echtem Verbindungsausfall auf den Cache zurück — damit
   Änderungen an der Seite nicht durch veraltete Caches verdeckt werden. */
self.addEventListener("fetch", (event) => {
  if (event.request.method !== "GET") return;
  const url = new URL(event.request.url);
  if (url.origin !== self.location.origin) return;

  event.respondWith(
    fetch(event.request)
      .then((response) => {
        const copy = response.clone();
        caches.open(CACHE_NAME).then((cache) => cache.put(event.request, copy));
        return response;
      })
      .catch(() => caches.match(event.request))
  );
});
