/**
 * Registrar Service Worker para notificaciones push
 * Ubicación: resources/js/registerServiceWorker.ts
 */

export const registerServiceWorker = async (): Promise<ServiceWorkerRegistration | null> => {
    // Verificar si el navegador soporta Service Workers
    if (!('serviceWorker' in navigator)) {
        console.warn('⚠️ Service Worker no soportado en este navegador');
        return null;
    }

    try {
        // Registrar el Service Worker
        const registration = await navigator.serviceWorker.register('/sw.js', {
            scope: '/',
            updateViaCache: 'none' // No cachear el Service Worker
        });

        console.log('✅ Service Worker registrado:', registration);

        // Esperar a que el SW esté activo
        await navigator.serviceWorker.ready;
        console.log('✅ Service Worker listo y activo');

        // Verificar si hay una actualización del SW
        registration.addEventListener('updatefound', () => {
            const newWorker = registration.installing;
            if (newWorker) {
                newWorker.addEventListener('statechange', () => {
                    if (newWorker.state === 'activated') {
                        console.log('🔄 Service Worker actualizado');
                        // Recargar la página para usar el nuevo SW
                        window.location.reload();
                    }
                });
            }
        });

        // Escuchar mensajes del Service Worker
        navigator.serviceWorker.addEventListener('message', (event) => {
            console.log('[Service Worker] Mensaje recibido:', event.data);
            
            // Si el SW solicita actualizar el token CSRF
            if (event.data && event.data.type === 'update-csrf-token') {
                const metaTag = document.querySelector('meta[name="csrf-token"]');
                if (metaTag && event.data.token) {
                    metaTag.setAttribute('content', event.data.token);
                    if (window.axios) {
                        window.axios.defaults.headers.common['X-CSRF-TOKEN'] = event.data.token;
                    }
                }
            }
        });

        // Verificar el estado del Service Worker periódicamente
        setInterval(() => {
            if (registration.active) {
                // Enviar un mensaje al SW para verificar que está activo
                registration.active.postMessage({ type: 'ping' });
            }
        }, 30000); // Cada 30 segundos

        return registration;
    } catch (error) {
        console.error('❌ Error al registrar Service Worker:', error);
        return null;
    }
};

/**
 * Solicitar permisos de notificación
 */
export const requestNotificationPermission = async (): Promise<NotificationPermission> => {
    if (!('Notification' in window)) {
        console.warn('⚠️ Notificaciones no soportadas en este navegador');
        return 'denied';
    }

    if (Notification.permission === 'granted') {
        console.log('✅ Permisos de notificación ya concedidos');
        return 'granted';
    }

    if (Notification.permission === 'denied') {
        console.warn('⚠️ Permisos de notificación denegados');
        return 'denied';
    }

    try {
        const permission = await Notification.requestPermission();
        if (permission === 'granted') {
            console.log('✅ Permisos de notificación concedidos');
        } else {
            console.warn('⚠️ Permisos de notificación denegados por el usuario');
        }
        return permission;
    } catch (error) {
        console.error('❌ Error al solicitar permisos de notificación:', error);
        return 'denied';
    }
};

/**
 * Mostrar una notificación de prueba
 */
export const showTestNotification = async (): Promise<void> => {
    if (Notification.permission !== 'granted') {
        console.warn('⚠️ No hay permisos para mostrar notificaciones');
        return;
    }

    try {
        const registration = await navigator.serviceWorker.ready;
        await registration.showNotification('Notificación de Prueba', {
            body: 'El sistema de notificaciones está funcionando correctamente',
            icon: '/build/assets/images/logo-sm.png',
            badge: '/build/assets/images/logo-sm.png',
            vibrate: [200, 100, 200],
            tag: 'test-notification',
            requireInteraction: false
        });
        console.log('✅ Notificación de prueba enviada');
    } catch (error) {
        console.error('❌ Error al mostrar notificación de prueba:', error);
    }
};
