@extends('layouts.app')
@section('title','Etapa 8 — Processando...')
@section('content')
 
<h2>Etapa 8 — Final Score / Resultado por Categoria</h2>
 
<div class="progresso-box">
 
    <div class="prog-arquivo-atual" id="prog-arquivo">Aguardando início...</div>
 
    <div class="prog-header">
        <span id="prog-label">Inicializando...</span>
        <span id="prog-pct">0%</span>
    </div>
    <div class="prog-track">
        <div class="prog-bar ativo" id="prog-bar" style="width:0%"></div>
    </div>
    <div class="prog-sub" id="prog-sub">&nbsp;</div>
 
    <div class="prog-log" id="prog-log">
        <div class="log-info">▶ Iniciando processamento...</div>
    </div>
 
    <div class="prog-resumo" id="prog-resumo" style="display:none">
        <h3>✅ Etapa 8 Concluída</h3>
 
        <div class="stats-grid" style="max-width:500px;margin:.75rem 0">
            <div class="stat-card">
                <div class="stat-number" id="r-ops">—</div>
                <div class="stat-label">Operadores Classificados</div>
            </div>
            <div class="stat-card stat-card-green">
                <div class="stat-number" id="r-cats">—</div>
                <div class="stat-label">Categorias</div>
            </div>
        </div>
 
        <table class="table" style="max-width:420px">
            <tr><th>Início</th>      <td id="r-inicio">—</td></tr>
            <tr><th>Fim</th>         <td id="r-fim">—</td></tr>
            <tr><th>Tempo total</th> <td id="r-tempo">—</td></tr>
        </table>
 
        {{-- Resumo por categoria --}}
        <div id="bloco-cats" style="display:none;margin-top:1.25rem">
            <h4 style="margin-bottom:.5rem">📊 Resultado por Categoria</h4>
            <div style="max-height:380px;overflow-y:auto">
                <table class="table" id="tbl-cats" style="margin-bottom:0">
                    <thead>
                        <tr>
                            <th>Categoria</th>
                            <th>Operadores</th>
                            <th>Total Score</th>
                        </tr>
                    </thead>
                    <tbody></tbody>
                </table>
            </div>
        </div>
 
        <div style="margin-top:1.5rem;display:flex;gap:.75rem;flex-wrap:wrap">
            <a href="{{ route('dashboard') }}"                 class="btn btn-secondary">← Dashboard</a>
            <a href="{{ route('processamento.resultado') }}"   class="btn btn-primary">Próxima Etapa: 9. Resultado Final →</a>
        </div>
    </div>
</div>
 
<style>
.progresso-box{background:#fff;border-radius:8px;padding:1.5rem 2rem;box-shadow:0 2px 12px rgba(0,0,0,.1);max-width:820px}
.prog-arquivo-atual{font-size:.82rem;color:var(--muted);margin-bottom:.6rem;min-height:1.4em;background:#f8f9fa;border-radius:4px;padding:.3rem .7rem;font-family:'Consolas',monospace}
.prog-header{display:flex;justify-content:space-between;align-items:center;margin-bottom:.35rem}
#prog-label{font-weight:600;font-size:.95rem}
#prog-pct{font-weight:700;color:var(--blue);font-size:1.05rem;min-width:3.5rem;text-align:right}
.prog-track{background:#e9ecef;border-radius:50px;height:26px;overflow:hidden;margin-bottom:.4rem}
.prog-bar{height:100%;background:linear-gradient(90deg,#1B4F8C,#2E86DE);border-radius:50px;transition:width .5s ease;min-width:0;position:relative}
.prog-bar.ativo::after{content:'';position:absolute;inset:0;background:linear-gradient(90deg,transparent,rgba(255,255,255,.25),transparent);animation:shimmer 1.2s linear infinite}
@keyframes shimmer{from{transform:translateX(-100%)}to{transform:translateX(100%)}}
.prog-bar.concluido{background:linear-gradient(90deg,#2E7D32,#43A047)}
.prog-bar.concluido::after{display:none}
.prog-sub{font-size:.8rem;color:var(--muted);min-height:1.1em;margin-bottom:.75rem}
.prog-log{background:#1a2332;color:#cdd5df;font-family:'Consolas','Courier New',monospace;font-size:.8rem;border-radius:6px;padding:.75rem 1rem;height:260px;overflow-y:auto;line-height:1.7;margin-bottom:1rem;border:1px solid #2c3e50}
.prog-log div{padding:.02rem 0}
.log-ok{color:#81c784}.log-info{color:#64b5f6}.log-erro{color:#ef9a9a}.log-dup{color:#ffcc80;font-weight:bold}.log-arq{color:#e0e0e0}
.prog-resumo h3{color:var(--green)}.prog-resumo h4{font-size:.95rem}
</style>
 
<script>
(function () {
    const barEl    = document.getElementById('prog-bar');
    const labelEl  = document.getElementById('prog-label');
    const pctEl    = document.getElementById('prog-pct');
    const subEl    = document.getElementById('prog-sub');
    const logEl    = document.getElementById('prog-log');
    const resumoEl = document.getElementById('prog-resumo');
    const arquivoEl= document.getElementById('prog-arquivo');

    let polling   = null;
    const startTime = Date.now();
    const FASES    = [
        'Fase 1/3 — Limpando tabela resultados_final...',
        'Fase 2/3 — Calculando ranking por categoria...',
        'Fase 3/3 — Inserindo resultados com ranking...',
    ];
 
    function addLog(msg, tipo) {
        const cls = {ok:'log-ok',info:'log-info',erro:'log-erro',dup:'log-dup',arq:'log-arq'}[tipo]||'';
        const d = document.createElement('div');
        if (cls) d.className = cls;
        d.textContent = msg;
        logEl.appendChild(d);
        logEl.scrollTop = logEl.scrollHeight;
    }

    function renderLog(linhas) {
        logEl.innerHTML = '';
        const cls = {ok:'log-ok',info:'log-info',erro:'log-erro',dup:'log-dup',arq:'log-arq'};
        (linhas||[]).forEach(function(l) {
            const d = document.createElement('div');
            if (cls[l.tipo]) d.className = cls[l.tipo];
            d.textContent = l.msg;
            logEl.appendChild(d);
            if (l.tipo==='arq'||l.tipo==='ok') arquivoEl.textContent = l.msg;
        });
        logEl.scrollTop = logEl.scrollHeight;
    }
 
    function setBar(atual, total) {
        const p = total > 0 ? Math.min(100, Math.round((atual/total)*100)) : 0;
        barEl.style.width = p+'%'; pctEl.textContent = p+'%';
    }
 
    function consultarStatus() {
        fetch('{{ route("processamento.final-score.status") }}', {cache:'no-store'})
            .then(r => r.json())
            .then(d => {
                renderLog(d.progresso || []);
 
                if (!d.concluido) {
                    setBar(d.atual, d.total);
                    const fase = FASES[d.atual] || 'Processando...';
                    labelEl.textContent   = fase;
                    arquivoEl.textContent = fase;
                    subEl.textContent     = 'Fase ' + (d.atual+1) + ' de ' + d.total;
                }
 
                if (d.concluido) {
                    if (d.resultado) {
                        clearInterval(polling);
                        exibirResumo(d.resultado, d.total);
                    }
                    // Se concluido mas resultado ainda null: continua polling (max 15 ciclos extras)
                    else {
                        window._semResultado = (window._semResultado || 0) + 1;
                        if (window._semResultado >= 15) {
                            clearInterval(polling);
                            // Exibe o que tiver — pelo menos desbloqueia a tela
                            exibirResumo({
                                total_logs: d.total, total_qsos: 0,
                                total_validos: 0, total_invalidos: 0,
                                tempo: '?', inicio: '—', fim: '—',
                                erros: [], inv: [], det_invalidos: [],
                                inv_tempo: [], inv_banda: [],
                                total_result: 0, banda_unk: 0,
                                total_participantes: 0, total_lidos: 0,
                                total_processados: 0, processados: 0,
                                duplicatas: [], score_total: 0,
                            }, d.total);
                        }
                    }
                }
            }).catch(() => {});
    }
 
    function exibirResumo(r, total) {
        // Grava tempo real e libera menu
        const segundosReais = Math.round((Date.now() - startTime) / 1000);
        confirmarConclusao('8', segundosReais);
        setBar(total, total);
        barEl.classList.remove('ativo'); barEl.classList.add('concluido');
        labelEl.textContent   = '✅ Concluído!';
        subEl.textContent     = '';
        arquivoEl.textContent = '✅ resultados_final gerado com sucesso.';
 
        document.getElementById('r-ops').textContent   = (r.total_ops||0).toLocaleString('pt-BR');
        document.getElementById('r-cats').textContent  = r.total_cats + ' categoria(s)';
        document.getElementById('r-inicio').textContent= r.inicio;
        document.getElementById('r-fim').textContent   = r.fim;
        document.getElementById('r-tempo').textContent = r.tempo;
 
        if (r.resumo_cats && r.resumo_cats.length > 0) {
            document.getElementById('bloco-cats').style.display = 'block';
            const tbody = document.querySelector('#tbl-cats tbody');
            r.resumo_cats.forEach(function(c) {
                const tr = document.createElement('tr');
                tr.innerHTML =
                    '<td style="font-size:.82rem">' + c.categoria + '</td>' +
                    '<td style="text-align:center">' + c.operadores + '</td>' +
                    '<td style="font-weight:bold;color:var(--blue)">' + c.total_score.toLocaleString('pt-BR') + '</td>';
                tbody.appendChild(tr);
            });
        }
 
        resumoEl.style.display = 'block';
        resumoEl.scrollIntoView({behavior:'smooth', block:'start'});
    }
 
    barEl.classList.add('ativo');
    fetch('{{ route("processamento.final-score.processar") }}', {
        method: 'POST',
        headers: {
            'X-CSRF-TOKEN': document.querySelector('meta[name="csrf-token"]').content,
            'Content-Type': 'application/json',
            'Accept':       'application/json',
        },
    }).catch(() => addLog('Falha ao iniciar.', 'erro'));
 
    consultarStatus();
    polling = setInterval(consultarStatus, 800);

    // ── Confirma conclusão ao backend e desbloqueio do menu ─────────────────
    // Chamado UMA vez quando exibirResumo() renderiza os botões finais.
    // Envia o tempo real medido pelo JS (mais preciso que o tempo do PHP).
    function desbloquearMenu() {
        // Remove imediatamente o bloqueio visual do menu sem esperar reload
        const nav = document.querySelector('nav.navbar');
        if (nav) nav.classList.remove('navbar-processando');
        const aviso = document.querySelector('.navbar-aviso-proc');
        if (aviso) aviso.remove();
        const menuDiv = document.querySelector('.navbar-menu');
        if (menuDiv) menuDiv.classList.remove('menu-desabilitado');
        document.querySelectorAll('.nav-disabled').forEach(el => el.classList.remove('nav-disabled'));
        const banner = document.querySelector('.alert-warning');
        if (banner && banner.textContent.includes('Processamento em andamento')) banner.remove();
    }

    function confirmarConclusao(etapa, segundos) {
        desbloquearMenu(); // desbloqueio imediato no DOM
        fetch('{{ route("processamento.concluir-etapa") }}', {
            method: 'POST',
            headers: {
                'X-CSRF-TOKEN': document.querySelector('meta[name="csrf-token"]').content,
                'Content-Type': 'application/json',
                'Accept': 'application/json',
            },
            body: JSON.stringify({ etapa: etapa, segundos: segundos }),
        }).catch(() => { /* silencia — não é crítico */ });
    }

}());
</script>
@endsection