const CACHE_NAME = 'taprestation-shell-v4';
const SHELL_ASSETS = [
  '/manifest.webmanifest',
  '/images/logo.png'
];

// URLs à ne pas cacher (ressources externes, CDN, etc)
const EXCLUDED_URLS = [
  'cdnjs.cloudflare.com',
  'fonts.bunny.net',
  'fonts.googleapis.com',
  'cdn.jsdelivr.net',
  'unpkg.com',
  'analytics',
  'api.github.com'
];

self.addEventListener('install', event => {
  event.waitUntil(
    caches.open(CACHE_NAME).then(cache => cache.addAll(SHELL_ASSETS)).catch(() => null)
  );
  self.skipWaiting();
});

// Allow the page to trigger immediate activation of an updated SW.
self.addEventListener('message', event => {
  try {
    if (event.data && event.data.type === 'SKIP_WAITING') {
      self.skipWaiting();
    }
  } catch (e) {
    // ignore
  }
});

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

self.addEventListener('fetch', event => {
  const request = event.request;
  
  // Ne traite que les GET
  if (request.method !== 'GET') return;
  
  const url = request.url;
  
  // Vérifie si c'est une URL exclue
  const isExcluded = EXCLUDED_URLS.some(excluded => url.includes(excluded));
  
  if (isExcluded) {
    // Pour les ressources externes, ne pas essayer de les cacher
    // Juste faire un fetch normal sans intervenir
    return;
  }

  // Pour les requêtes de navigation (HTML), TOUJOURS aller au réseau
  // Ne jamais cacher les pages HTML pour éviter les problèmes de navigation
  if (request.mode === 'navigate') {
    event.respondWith(
      fetch(request, { cache: 'no-store' })
        .catch(() => caches.match('/offline.html').then(cached => cached || new Response('Offline', { status: 503 })))
    );
    return;
  }

  // Pour les fichiers HTML (au cas où mode !== navigate mais c'est du HTML)
  if (url.endsWith('.html') || request.headers.get('accept')?.includes('text/html')) {
    event.respondWith(fetch(request, { cache: 'no-store' }));
    return;
  }
  
  // Pour les ressources statiques uniquement (JS, CSS, images), cache-first strategy
  const isStaticAsset = /\.(js|css|png|jpg|jpeg|gif|webp|svg|ico|woff2?|ttf|eot)(\?.*)?$/i.test(url);
  
  if (!isStaticAsset) {
    // Pour tout ce qui n'est pas un asset statique, aller au réseau
    event.respondWith(fetch(request));
    return;
  }
  
  event.respondWith(
    caches.match(request).then(cached => {
      if (cached) {
        return cached;
      }
      
      return fetch(request)
        .then(response => {
          // Ne cache que les 200 OK avec un vrai contenu
          if (!response || response.status !== 200 || response.type === 'error') {
            return response;
          }
          
          const clone = response.clone();
          caches.open(CACHE_NAME)
            .then(cache => {
              cache.put(request, clone).catch(() => null);
            })
            .catch(() => null);
          
          return response;
        })
        .catch(error => {
          // En cas d'erreur, retourne la version en cache ou une erreur
          return cached || Response.error();
        });
    })
  );
});
