/**
 * Fichier  : sw.js
 * Auteur   : KREMER Régis
 * Version  : 2.2.0
 * Date     : 2026-02-21
 * Description : Service Worker — Cache offline et gestion des push notifications
 *
 * Changelog :
 *   v2.1.0 (2026-02-21) — Version initiale auditée et sécurisée
 *   v2.1.1 (2026-02-21) — Corrections sécurité, utils.js centralisé
 *   v2.2.0 (2026-02-21) — Permissions magasins, bons de commande, rapport d'écart,
 *                      import CSV, historique prix, bon de livraison multi-lignes
 */
// ================================================================
// sw.js — Service Worker pour StockMaster Pro
// Gère les notifications push et le cache offline basique
// ================================================================

const CACHE_NAME = 'stockmaster-v4.2';
const STATIC_ASSETS = [
    '/sm/',
    '/sm/index.php',
    '/sm/login.php',
    '/sm/assets/css/app.css',
    '/sm/assets/js/app.js'
];

// ════════════════════════════════════════════════════════════════
// INSTALLATION
// ════════════════════════════════════════════════════════════════
self.addEventListener('install', (event) => {
    console.log('[SW] Installation...');
    event.waitUntil(
        caches.open(CACHE_NAME)
            .then(cache => {
                console.log('[SW] Mise en cache des assets statiques');
                return cache.addAll(STATIC_ASSETS).catch(err => {
                    console.warn('[SW] Certains assets non mis en cache:', err);
                });
            })
            .then(() => self.skipWaiting())
    );
});

// ════════════════════════════════════════════════════════════════
// ACTIVATION
// ════════════════════════════════════════════════════════════════
self.addEventListener('activate', (event) => {
    console.log('[SW] Activation...');
    event.waitUntil(
        caches.keys()
            .then(keys => Promise.all(
                keys.filter(k => k !== CACHE_NAME).map(k => caches.delete(k))
            ))
            .then(() => self.clients.claim())
    );
});

// ════════════════════════════════════════════════════════════════
// FETCH — Network first avec fallback cache
// ════════════════════════════════════════════════════════════════
self.addEventListener('fetch', (event) => {
    // Ignorer les requêtes non-GET et les API
    if (event.request.method !== 'GET' || event.request.url.includes('/api/')) {
        return;
    }
    
    event.respondWith(
        fetch(event.request)
            .then(response => {
                // Mettre en cache les réponses réussies
                if (response.status === 200) {
                    const clone = response.clone();
                    caches.open(CACHE_NAME).then(cache => {
                        cache.put(event.request, clone);
                    });
                }
                return response;
            })
            .catch(() => {
                // Fallback au cache si offline
                return caches.match(event.request);
            })
    );
});

// ════════════════════════════════════════════════════════════════
// PUSH NOTIFICATIONS
// ════════════════════════════════════════════════════════════════
self.addEventListener('push', (event) => {
    console.log('[SW] Push reçu:', event);
    
    let data = {
        title: 'StockMaster Pro',
        body: 'Nouvelle notification',
        icon: '/sm/assets/img/icon-192.png',
        badge: '/sm/assets/img/badge-72.png',
        tag: 'stockmaster-notification',
        requireInteraction: false,
        data: { url: '/sm/' }
    };
    
    // Parser les données du push
    if (event.data) {
        try {
            const payload = event.data.json();
            data = { ...data, ...payload };
        } catch (e) {
            data.body = event.data.text();
        }
    }
    
    // Déterminer l'icône selon le type
    const iconMap = {
        'stock_out': '/sm/assets/img/notif-out.png',
        'stock_in': '/sm/assets/img/notif-in.png',
        'alert': '/sm/assets/img/notif-alert.png',
        'inventory': '/sm/assets/img/notif-inventory.png'
    };
    
    if (data.type && iconMap[data.type]) {
        data.icon = iconMap[data.type];
    }
    
    // Actions selon le type
    const actions = [];
    if (data.type === 'alert') {
        actions.push(
            { action: 'view', title: 'Voir les alertes' },
            { action: 'dismiss', title: 'Ignorer' }
        );
    } else if (data.type === 'stock_out' || data.type === 'stock_in') {
        actions.push(
            { action: 'view', title: 'Voir le mouvement' }
        );
    }
    
    const options = {
        body: data.body,
        icon: data.icon,
        badge: data.badge || '/sm/assets/img/badge-72.png',
        tag: data.tag || 'stockmaster-' + Date.now(),
        requireInteraction: data.requireInteraction || false,
        vibrate: [200, 100, 200],
        data: data.data || { url: '/sm/' },
        actions: actions,
        timestamp: Date.now()
    };
    
    event.waitUntil(
        self.registration.showNotification(data.title, options)
    );
});

// ════════════════════════════════════════════════════════════════
// NOTIFICATION CLICK
// ════════════════════════════════════════════════════════════════
self.addEventListener('notificationclick', (event) => {
    console.log('[SW] Notification cliquée:', event);
    
    event.notification.close();
    
    let url = '/sm/';
    
    // Déterminer l'URL selon l'action ou les données
    if (event.action === 'view') {
        const data = event.notification.data || {};
        url = data.url || '/sm/';
    } else if (event.action === 'dismiss') {
        return;
    } else if (event.notification.data && event.notification.data.url) {
        url = event.notification.data.url;
    }
    
    // Ouvrir ou focus la fenêtre
    event.waitUntil(
        clients.matchAll({ type: 'window', includeUncontrolled: true })
            .then(clientList => {
                // Chercher une fenêtre existante
                for (const client of clientList) {
                    if (client.url.includes('/sm/') && 'focus' in client) {
                        client.navigate(url);
                        return client.focus();
                    }
                }
                // Sinon ouvrir une nouvelle fenêtre
                if (clients.openWindow) {
                    return clients.openWindow(url);
                }
            })
    );
});

// ════════════════════════════════════════════════════════════════
// NOTIFICATION CLOSE
// ════════════════════════════════════════════════════════════════
self.addEventListener('notificationclose', (event) => {
    console.log('[SW] Notification fermée:', event.notification.tag);
});

// ════════════════════════════════════════════════════════════════
// MESSAGE HANDLING (communication avec la page)
// ════════════════════════════════════════════════════════════════
self.addEventListener('message', (event) => {
    console.log('[SW] Message reçu:', event.data);
    
    if (event.data && event.data.type === 'SKIP_WAITING') {
        self.skipWaiting();
    }
});
