@extends('layouts.app')
@section('title','Etapa 9 — Processando...')
@section('content')
 
<h2>Etapa 9 — Resultado Final</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...</div>
    </div>
 
    <div class="prog-resumo" id="prog-resumo" style="display:none">
        <h3>✅ Etapa 9 Concluída</h3>
 
        {{-- Totais --}}
        <div class="stats-grid" style="max-width:600px;margin:.75rem 0">
            <div class="stat-card">
                <div class="stat-number" id="r-ops">—</div>
                <div class="stat-label">Operadores</div>
            </div>
            <div class="stat-card">
                <div class="stat-number" id="r-cats">—</div>
                <div class="stat-label">Categorias</div>
            </div>
            <div class="stat-card stat-card-green">
                <div class="stat-number" id="r-grand">—</div>
                <div class="stat-label">Grand Total Score</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>
 
        {{-- Primeiros colocados por categoria --}}
        <div id="bloco-lideres" style="display:none;margin-top:1.5rem">
            <h4 style="margin-bottom:.5rem">🏆 Primeiros Colocados por Categoria</h4>
            <div style="max-height:340px;overflow-y:auto">
                <table class="table" id="tbl-lideres" style="margin-bottom:0">
                    <thead>
                        <tr>
                            <th>#</th>
                            <th>Categoria</th>
                            <th>Callsign</th>
                            <th>Nome</th>
                            <th>Final Score</th>
                            <th>Pontos</th>
                            <th>Multi1</th>
                            <th>Multi2</th>
                            <th>Multi3</th>
                        </tr>
                    </thead>
                    <tbody></tbody>
                </table>
            </div>
        </div>
 
        {{-- Top 3 por categoria (acordeão) --}}
        <div id="bloco-cats" style="display:none;margin-top:1.5rem">
            <h4 style="margin-bottom:.75rem">📋 Top 3 por Categoria</h4>
            <div id="accordion-cats"></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.records') }}"   class="btn btn-primary">Próxima Etapa: 10. Records →</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:900px}
.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:200px;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}.log-arq{color:#e0e0e0}
.prog-resumo h3{color:var(--green)}.prog-resumo h4{font-size:.95rem}
/* Acordeão de categorias */
.cat-item{border:1px solid var(--gray-brd);border-radius:var(--radius);margin-bottom:.4rem}
.cat-header{padding:.6rem 1rem;cursor:pointer;display:flex;justify-content:space-between;align-items:center;background:#f8f9fa;border-radius:var(--radius);font-size:.88rem;font-weight:600}
.cat-header:hover{background:var(--blue-lt)}
.cat-body{display:none;padding:.5rem 1rem}
.cat-body.open{display:block}
</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/2 — Atualizando category_id...',
        'Fase 2/2 — Compilando resultado por categoria...',
    ];
 
    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.resultado.status") }}', {cache:'no-store'})
            .then(r => r.json())
            .then(d => {
                renderLog(d.progresso || []);
                if (!d.concluido) {
                    setBar(d.atual, d.total);
                    labelEl.textContent   = FASES[d.atual] || 'Processando...';
                    arquivoEl.textContent = FASES[d.atual] || 'Processando...';
                    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('9', segundosReais);
        setBar(total, total);
        barEl.classList.remove('ativo'); barEl.classList.add('concluido');
        labelEl.textContent   = '✅ Concluído!';
        subEl.textContent     = '';
        arquivoEl.textContent = '✅ Resultado 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-grand').textContent = (r.grand_total||0).toLocaleString('pt-BR');
        document.getElementById('r-inicio').textContent= r.inicio;
        document.getElementById('r-fim').textContent   = r.fim;
        document.getElementById('r-tempo').textContent = r.tempo;
 
        // Tabela de primeiros colocados
        if (r.lideres && r.lideres.length > 0) {
            document.getElementById('bloco-lideres').style.display = 'block';
            const tbody = document.querySelector('#tbl-lideres tbody');
            r.lideres.forEach(function(l, i) {
                const tr = document.createElement('tr');
                tr.innerHTML =
                    '<td style="color:var(--muted);font-size:.82rem">' + (i+1) + '</td>' +
                    '<td style="font-size:.78rem">' + l.categoria + '</td>' +
                    '<td><strong>' + l.callsign + '</strong></td>' +
                    '<td>' + l.nome + '</td>' +
                    '<td style="font-weight:bold;color:var(--blue)">' + l.final_score.toLocaleString('pt-BR') + '</td>' +
                    '<td>' + l.pontos.toLocaleString('pt-BR') + '</td>' +
                    '<td>' + l.multi_um + '</td>' +
                    '<td>' + l.multi_dois + '</td>' +
                    '<td>' + l.multi_tres + '</td>';
                tbody.appendChild(tr);
            });
        }
 
        // Acordeão Top 3 por categoria
        if (r.resumo_cats && r.resumo_cats.length > 0) {
            document.getElementById('bloco-cats').style.display = 'block';
            const acc = document.getElementById('accordion-cats');
            r.resumo_cats.forEach(function(cat) {
                const item = document.createElement('div');
                item.className = 'cat-item';
 
                const top1Score = cat.top3.length > 0 ? cat.top3[0].final_score.toLocaleString('pt-BR') : '—';
                const header = document.createElement('div');
                header.className = 'cat-header';
                header.innerHTML =
                    '<span>' + cat.nome + ' <span style="color:var(--muted);font-weight:normal">(' + cat.total_ops + ' op.)</span></span>' +
                    '<span style="color:var(--blue)">1°: ' + top1Score + '</span>';
 
                const body = document.createElement('div');
                body.className = 'cat-body';
 
                if (cat.top3.length > 0) {
                    let tbl = '<table class="table" style="margin:0;font-size:.82rem"><thead><tr>' +
                        '<th>#</th><th>Callsign</th><th>Nome</th><th>QSOs</th><th>Pontos</th><th>Final Score</th><th>% Red.</th>' +
                        '</tr></thead><tbody>';
                    cat.top3.forEach(function(op) {
                        const medal = op.rk === 1 ? '🥇' : op.rk === 2 ? '🥈' : '🥉';
                        tbl += '<tr>' +
                            '<td>' + medal + ' ' + op.rk + '</td>' +
                            '<td><strong>' + op.callsign + '</strong></td>' +
                            '<td>' + (op.nome||'') + '</td>' +
                            '<td>' + op.qsos + '</td>' +
                            '<td>' + op.pontos.toLocaleString('pt-BR') + '</td>' +
                            '<td style="font-weight:bold;color:var(--blue)">' + op.final_score.toLocaleString('pt-BR') + '</td>' +
                            '<td>' + (op.reducao ? parseFloat(op.reducao).toFixed(1)+'%' : '—') + '</td>' +
                            '</tr>';
                    });
                    tbl += '</tbody></table>';
                    body.innerHTML = tbl;
                }
 
                header.addEventListener('click', function() {
                    body.classList.toggle('open');
                });
 
                item.appendChild(header);
                item.appendChild(body);
                acc.appendChild(item);
            });
        }
 
        resumoEl.style.display = 'block';
        resumoEl.scrollIntoView({behavior:'smooth', block:'start'});
    }
 
    barEl.classList.add('ativo');
    fetch('{{ route("processamento.resultado.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