/**
 * Sonora — Service Worker (sw.js)
 * Mantém reprodução de áudio em segundo plano mesmo com tela apagada.
 *
 * Estratégia combinada:
 * 1. Responde KEEP_ALIVE do player para manter o SW vivo.
 * 2. Cache-first para assets estáticos; network-first para API/busca.
 * 3. Credentials incluídas nas requisições para manter sessão.
 */

const CACHE = 'sonora-v2';

self.addEventListener('install',  e => { 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(() => clients.claim())
    );
});

// Estado interno
let _currentTrack = null;

// Mensagens do player
self.addEventListener('message', e => {
    const { type, data } = e.data || {};

    if (type === 'KEEP_ALIVE') {
        // Mantém o SW acordado respondendo de volta
        e.waitUntil(new Promise(resolve => {
            e.source?.postMessage({ type: 'ALIVE', ts: Date.now() });
            resolve();
        }));
    }

    if (type === 'SET_TRACK') {
        _currentTrack = data;
    }

    if (type === 'PING') {
        e.source?.postMessage({ type: 'PONG', ts: Date.now() });
    }
});

// Intercepta requisições
self.addEventListener('fetch', e => {
    const url = new URL(e.request.url);

    // Não intercepta externas (YouTube, Google Fonts, etc)
    if (url.origin !== location.origin) return;

    // Network-first para API e busca (dados sempre frescos + mantém sessão)
    if (url.pathname.includes('api.php') || url.pathname.includes('search.php')) {
        e.respondWith(
            fetch(e.request, { credentials: 'same-origin' }).catch(() =>
                new Response(JSON.stringify({ ok: false, error: 'Offline' }), {
                    headers: { 'Content-Type': 'application/json' }
                })
            )
        );
        return;
    }

    // Cache-first para imagens, fontes e CSS
    if (e.request.destination === 'image' ||
        e.request.destination === 'font'  ||
        url.pathname.endsWith('.css')) {
        e.respondWith(
            caches.open(CACHE).then(cache =>
                cache.match(e.request).then(cached =>
                    cached || fetch(e.request).then(res => {
                        if (res && res.ok) cache.put(e.request, res.clone());
                        return res;
                    }).catch(() => cached || Response.error())
                )
            )
        );
    }
});
