// notificacoes_global.js - Sistema de Notificações Global
class NotificacoesGlobal {
    constructor() {
        this.notificacoesAtivas = new Map();
        this.intervaloVerificacao = 60000; // 1 minuto
        this.urlBuscarNotificacoes = 'buscar_notificacoes.php';
        this.inicializado = false;
        
        this.inicializar();
    }

    inicializar() {
        if (this.inicializado) return;
        
        console.log('🔔 Inicializando sistema de notificações global...');
        
        // Verificar permissão de notificações
        this.inicializarNotificacoesBrowser();
        
        // Verificar notificações imediatamente
        this.verificarNotificacoes();
        
        // Configurar verificação periódica
        setInterval(() => {
            this.verificarNotificacoes();
        }, this.intervaloVerificacao);
        
        // Verificar quando a página ganha foco
        document.addEventListener('visibilitychange', () => {
            if (!document.hidden) {
                this.verificarNotificacoes();
            }
        });
        
        this.inicializado = true;
    }

    inicializarNotificacoesBrowser() {
        if (!("Notification" in window)) {
            console.log("❌ Navegador não suporta notificações");
            return false;
        }

        if (Notification.permission === "default") {
            Notification.requestPermission().then(permission => {
                if (permission === "granted") {
                    console.log("✅ Permissão para notificações concedida");
                }
            });
        }
        
        return Notification.permission === "granted";
    }

    verificarNotificacoes() {
        const timestamp = new Date().getTime();
        const url = `${this.urlBuscarNotificacoes}?t=${timestamp}`;
        
        fetch(url)
            .then(response => {
                if (!response.ok) throw new Error('Erro: ' + response.status);
                return response.json();
            })
            .then(data => {
                if (data && data.success === true) {
                    const notificacoes = data.notificacoes || [];
                    this.processarNotificacoes(notificacoes);
                } else {
                    console.error('❌ Erro na resposta:', data?.message);
                }
            })
            .catch(error => {
                console.error('❌ Erro ao buscar notificações:', error);
            });
    }

    processarNotificacoes(notificacoes) {
        if (notificacoes.length === 0) return;

        console.log(`📢 ${notificacoes.length} notificação(ões) encontrada(s)`);
        
        notificacoes.forEach(notificacao => {
            // Verificar se já existe uma notificação ativa para esta atividade
            if (!this.notificacoesAtivas.has(notificacao.id)) {
                this.mostrarNotificacaoPersistente(notificacao);
            }
        });
    }

    mostrarNotificacaoPersistente(notificacao) {
        if (!notificacao) return;
        
        try {
            const dataHora = new Date(notificacao.data_agendada);
            const agora = new Date();
            const diffMinutos = Math.round((dataHora - agora) / (1000 * 60));
            const isAtrasada = diffMinutos < 0;

            const dataFormatada = dataHora.toLocaleString('pt-BR', {
                day: '2-digit',
                month: '2-digit',
                year: 'numeric',
                hour: '2-digit',
                minute: '2-digit'
            });

            let bodyText = `📋 ${notificacao.nome || 'Atividade'}\n`;
            bodyText += `📅 ${dataFormatada}\n`;
            
            if (notificacao.duracao_minutos) {
                bodyText += `⏱️ ${this.formatarDuracao(notificacao.duracao_minutos)}\n`;
            }
            
            if (notificacao.Nome_Cliente) {
                bodyText += `👤 ${notificacao.Nome_Cliente}\n`;
            }
            
            bodyText += isAtrasada ? 
                `🔴 ATRASADA ${Math.abs(diffMinutos)}min` : 
                `🟡 Em ${diffMinutos}min`;

            // Criar notificação do navegador
            if (Notification.permission === "granted") {
                const notification = new Notification(
                    isAtrasada ? '🔴 Atividade Atrasada' : '⏰ Lembrete de Atividade',
                    {
                        body: bodyText,
                        icon: '/favicon_io/favicon-32x32.png',
                        badge: '/favicon_io/favicon-32x32.png',
                        requireInteraction: true,
                        tag: 'son-global-' + notificacao.id
                    }
                );

                // Armazenar referência
                this.notificacoesAtivas.set(notificacao.id, notification);

                // Quando a notificação é fechada
                notification.onclose = () => {
                    this.notificacoesAtivas.delete(notificacao.id);
                    this.removerNotificacaoPagina(notificacao.id);
                };

                // Quando clica na notificação
                notification.onclick = () => {
                    notification.close();
                    this.abrirDetalhesAtividade(notificacao.id);
                };
            }

            // Criar alerta na página
            this.criarAlertaPagina(notificacao);

        } catch (error) {
            console.error('❌ Erro ao criar notificação:', error);
        }
    }

    criarAlertaPagina(notificacao) {
        const existingContainer = document.getElementById(`notificacao-global-${notificacao.id}`);
        if (existingContainer) {
            existingContainer.remove();
        }

        const dataHora = new Date(notificacao.data_agendada);
        const agora = new Date();
        const diffMinutos = Math.round((dataHora - agora) / (1000 * 60));
        const isAtrasada = diffMinutos < 0;

        const container = document.createElement('div');
        container.id = `notificacao-global-${notificacao.id}`;
        container.className = `alert ${isAtrasada ? 'alert-danger' : 'alert-warning'} alert-dismissible fade show`;
        container.style.cssText = `
            position: fixed;
            top: 100px;
            right: 20px;
            z-index: 9999;
            min-width: 350px;
            max-width: 500px;
            box-shadow: 0 4px 12px rgba(0,0,0,0.3);
            margin-bottom: 10px;
        `;
        
        const dataFormatada = dataHora.toLocaleString('pt-BR', {
            day: '2-digit',
            month: '2-digit',
            hour: '2-digit',
            minute: '2-digit'
        });

        container.innerHTML = `
            <div class="d-flex justify-content-between align-items-start">
                <div class="flex-grow-1">
                    <strong>${isAtrasada ? '🔴 Atrasada' : '⏰ Lembrete'}: ${notificacao.nome}</strong>
                    <div class="small mt-1">
                        <div>📅 ${dataFormatada}</div>
                        ${notificacao.Nome_Cliente ? `<div>👤 ${notificacao.Nome_Cliente}</div>` : ''}
                        ${notificacao.duracao_minutos ? `<div>⏱️ ${this.formatarDuracao(notificacao.duracao_minutos)}</div>` : ''}
                        <div>${isAtrasada ? `🔴 ${Math.abs(diffMinutos)}min atrasada` : `🟡 Em ${diffMinutos}min`}</div>
                    </div>
                </div>
                <button type="button" class="btn-close ms-2" onclick="window.sistemaNotificacoes.removerNotificacaoPagina(${notificacao.id})"></button>
            </div>
            <div class="mt-2">
                <button type="button" class="btn btn-sm btn-outline-primary me-1" onclick="window.sistemaNotificacoes.adiarNotificacao(${notificacao.id}, 5)">
                    ⏰ 5min
                </button>
                <button type="button" class="btn btn-sm btn-outline-warning me-1" onclick="window.sistemaNotificacoes.adiarNotificacao(${notificacao.id}, 15)">
                    ⏰ 15min
                </button>
                <button type="button" class="btn btn-sm btn-outline-success" onclick="window.sistemaNotificacoes.abrirDetalhesAtividade(${notificacao.id})">
                    📅 Ver
                </button>
            </div>
        `;
        
        document.body.appendChild(container);
    }

    removerNotificacaoPagina(notificacaoId) {
        const container = document.getElementById(`notificacao-global-${notificacaoId}`);
        if (container) {
            container.remove();
        }
        
        // Fechar também a notificação do navegador
        const notification = this.notificacoesAtivas.get(notificacaoId);
        if (notification) {
            notification.close();
        }
        this.notificacoesAtivas.delete(notificacaoId);
    }

    adiarNotificacao(atividadeId, minutos) {
        this.removerNotificacaoPagina(atividadeId);
        
        fetch('adiar_notificacao.php', {
            method: 'POST',
            headers: {
                'Content-Type': 'application/x-www-form-urlencoded',
            },
            body: `id=${atividadeId}&minutos=${minutos}&csrf_token=${this.getCsrfToken()}`
        })
        .then(response => response.json())
        .then(data => {
            if (data.success) {
                console.log(`⏰ Notificação adiada por ${minutos} minutos`);
                
                if (Notification.permission === "granted") {
                    const confirmation = new Notification('⏰ Notificação Adiada', {
                        body: `Lembrete reagendado para daqui a ${minutos} minutos`,
                        icon: '/favicon_io/favicon-32x32.png'
                    });
                    
                    setTimeout(() => {
                        if (confirmation) confirmation.close();
                    }, 3000);
                }
            }
        })
        .catch(error => {
            console.error('❌ Erro ao adiar notificação:', error);
        });
    }

    abrirDetalhesAtividade(atividadeId) {
        this.removerNotificacaoPagina(atividadeId);
        
        // Se estiver na página do calendário, usar a função existente
        if (typeof mostrarDetalhesAtividade === 'function') {
            // Buscar dados da atividade primeiro
            fetch('buscar_atividade.php', {
                method: 'POST',
                headers: {
                    'Content-Type': 'application/x-www-form-urlencoded',
                },
                body: `id=${atividadeId}&csrf_token=${this.getCsrfToken()}`
            })
            .then(response => response.json())
            .then(data => {
                if (data.success) {
                    const eventoSimulado = {
                        id: atividadeId,
                        title: data.atividade.nome,
                        extendedProps: data.atividade
                    };
                    mostrarDetalhesAtividade(eventoSimulado);
                } else {
                    // Redirecionar para o calendário se não conseguir carregar
                    window.location.href = 'calendario.php?id=' + atividadeId;
                }
            })
            .catch(error => {
                window.location.href = 'calendario.php?id=' + atividadeId;
            });
        } else {
            // Redirecionar para o calendário
            window.location.href = 'calendario.php?id=' + atividadeId;
        }
    }

    formatarDuracao(minutos) {
        if (minutos < 60) {
            return minutos + ' minutos';
        } else {
            const horas = Math.floor(minutos / 60);
            const minutosRestantes = minutos % 60;
            if (minutosRestantes === 0) {
                return horas + ' hora' + (horas > 1 ? 's' : '');
            } else {
                return horas + 'h' + (minutosRestantes < 10 ? '0' : '') + minutosRestantes + 'min';
            }
        }
    }

    getCsrfToken() {
        // Tentar obter o token CSRF da meta tag ou de um input hidden
        const metaToken = document.querySelector('meta[name="csrf-token"]');
        if (metaToken) return metaToken.getAttribute('content');
        
        const inputToken = document.querySelector('input[name="csrf_token"]');
        if (inputToken) return inputToken.value;
        
        return '';
    }
}

// Inicializar o sistema globalmente
window.sistemaNotificacoes = new NotificacoesGlobal();