// Incrémenter à chaque déploiement pour vider les anciens caches (assets statiques).
const CACHE = 'crewplan-v2';
const STATIC = [
  '/',
  '/index.html',
  '/css/style.css',
  '/js/app.js',
  '/icons/icon-192.png',
  '/icons/icon-512.png',
  '/manifest.json',
];

// Installation : mise en cache des fichiers statiques
self.addEventListener('install', (e) => {
  e.waitUntil(
    caches.open(CACHE).then((cache) => cache.addAll(STATIC))
  );
  self.skipWaiting();
});

// Activation : purge des anciens caches
self.addEventListener('activate', (e) => {
  e.waitUntil(
    caches.keys().then((keys) =>
      Promise.all(keys.filter((k) => k !== CACHE).map((k) => caches.delete(k)))
    )
  );
  self.clients.claim();
});

// Fetch : Network-first pour l'API, Cache-first pour les statiques
self.addEventListener('fetch', (e) => {
  const url = new URL(e.request.url);

  // Only handle http/https — chrome-extension:// and others are unsupported by Cache API
  if (!url.protocol.startsWith('http')) return;

  // API : toujours réseau (pointage doit être en temps réel)
  if (url.pathname.startsWith('/api/')) {
    e.respondWith(
      fetch(e.request).catch(() =>
        new Response(JSON.stringify({ message: 'Hors ligne — vérifiez votre connexion' }), {
          status: 503,
          headers: { 'Content-Type': 'application/json' },
        })
      )
    );
    return;
  }

  // Fichiers statiques : cache-first avec fallback réseau
  e.respondWith(
    caches.match(e.request).then((cached) => {
      if (cached) return cached;
      return fetch(e.request).then((resp) => {
        // Mettre en cache uniquement les réponses valides
        if (resp && resp.status === 200 && resp.type === 'basic') {
          const clone = resp.clone();
          caches.open(CACHE).then((cache) => cache.put(e.request, clone));
        }
        return resp;
      });
    }).catch(() => caches.match('/index.html'))
  );
});
