/* SPDX-License-Identifier: AGPL-3.0-only
   SPDX-FileCopyrightText: 2026 Com'Together
   Com'Together — Ma communication. Copyright (C) 2026 Com'Together.
   Programme libre sous AGPL-3.0-only — voir LICENSE. */
/* Service worker — fonctionnement hors-ligne, tout local.
 * Stratégie :
 *  - fichiers de l'appli (html/js/css/json) : RÉSEAU d'abord (mises à jour immédiates),
 *    repli sur le cache si hors-ligne.
 *  - pictogrammes / médias (assets/…) : CACHE d'abord (rapides, rarement modifiés).
 */
const CACHE = "comtogether-caa-v399";
const SHELL = [
  "./", "./index.html", "./styles.css", "./app.js", "./grammar.js", "./sentence.js", "./lang/jsr-map.js", "./custom.js",
  "./vocab.default.json", "./manifest.webmanifest", "./mode-emploi.html",
  "./assets/icon.svg", "./assets/icon-192.png", "./assets/icon-512.png", "./assets/apple-touch-icon.png",
  "./assets/brand/comtogether-logo.svg", "./assets/brand/comtogether-logo-blanc.svg",
];

self.addEventListener("install", e => {
  e.waitUntil(caches.open(CACHE).then(c => c.addAll(SHELL)).then(() => self.skipWaiting()));
});
self.addEventListener("message", e => { if (e.data === "skip") self.skipWaiting(); });
self.addEventListener("activate", e => {
  e.waitUntil(caches.keys().then(keys =>
    Promise.all(keys.filter(k => k !== CACHE).map(k => caches.delete(k)))).then(() => self.clients.claim()));
});
self.addEventListener("fetch", e => {
  if (e.request.method !== "GET") return;
  const url = new URL(e.request.url);
  // Kit d'installation (.zip, ~40 Mo) : téléchargement direct, JAMAIS mis en cache
  // (sinon il gonflerait le stockage hors-ligne de l'appareil).
  if (url.pathname.endsWith(".zip")) return;
  const isAsset = url.pathname.includes("/assets/");
  if (isAsset) {
    // cache d'abord
    e.respondWith(caches.match(e.request).then(hit => hit || fetch(e.request).then(res => {
      const copy = res.clone(); caches.open(CACHE).then(c => c.put(e.request, copy)).catch(() => {});
      return res;
    })));
  } else {
    // réseau d'abord
    e.respondWith(fetch(e.request).then(res => {
      const copy = res.clone(); caches.open(CACHE).then(c => c.put(e.request, copy)).catch(() => {});
      return res;
    }).catch(() => caches.match(e.request)));
  }
});
