// Nombre del caché para la aplicación
const CACHE_NAME = 'radius-nucleo-cache-v3';

// Archivos que se almacenarán en caché durante la instalación
const URLS_TO_CACHE = [
  '/',
  '/index.html',
  '/manifest.json',
  '/sw.js',
  // Iconos
  '/icons/icon-192.png',
  '/icons/icon-512.png',
  '/icons/icon-192-maskable.png',
  '/icons/icon-512-maskable.png',
  '/icons/icon-192-black.png',
  '/icons/icon-512-black.png',
  // Capturas de pantalla
  '/screenshots/screenshot-desktop.png',
  '/screenshots/screenshot-mobile.png'
];

// Evento de instalación: almacena los archivos definidos en la caché
self.addEventListener('install', (event) => {
  event.waitUntil(
    caches.open(CACHE_NAME)
      .then((cache) => cache.addAll(URLS_TO_CACHE))
  );
});

// Evento de activación: limpia los caches antiguos
self.addEventListener('activate', (event) => {
  event.waitUntil(
    caches.keys().then((cacheNames) => {
      return Promise.all(
        cacheNames.map((cacheName) => {
          if (cacheName !== CACHE_NAME) {
            return caches.delete(cacheName);
          }
        })
      );
    })
  );
});

// Evento de recuperación (fetch): estrategia inteligente según el tipo de recurso
self.addEventListener('fetch', (event) => {
  const url = new URL(event.request.url);

  // Excluir las peticiones a /api/* del Service Worker
  // Estas peticiones requieren autenticación y no deben ser cacheadas
  if (url.pathname.startsWith('/api/')) {
    return;
  }

  // Para archivos de build (JS/CSS en /assets/): Network-first con cache fallback
  // Esto asegura que siempre se intente obtener la versión más reciente
  if (url.pathname.startsWith('/assets/')) {
    event.respondWith(
      fetch(event.request)
        .then((response) => {
          // Guardar en cache la nueva versión
          const responseClone = response.clone();
          caches.open(CACHE_NAME).then((cache) => {
            cache.put(event.request, responseClone);
          });
          return response;
        })
        .catch(() => {
          // Si falla la red, usar cache
          return caches.match(event.request);
        })
    );
    return;
  }

  // Para HTML: Network-first siempre
  if (url.pathname.endsWith('.html') || url.pathname === '/') {
    event.respondWith(
      fetch(event.request)
        .catch(() => {
          // Solo si falla la red, usar cache
          return caches.match(event.request);
        })
    );
    return;
  }

  // Para recursos estáticos (iconos, manifest, etc.): Cache-first
  // Estos archivos rara vez cambian
  event.respondWith(
    caches.match(event.request)
      .then((response) => {
        if (response) {
          return response;
        }
        return fetch(event.request).then((response) => {
          // Guardar en cache si es exitoso
          if (response.status === 200) {
            const responseClone = response.clone();
            caches.open(CACHE_NAME).then((cache) => {
              cache.put(event.request, responseClone);
            });
          }
          return response;
        });
      })
  );
});