<?php
namespace App\Http\Controllers\Logs;
 
use App\Http\Controllers\Controller;
use App\Models\ContestDate;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Mail;
 
class LogController extends Controller
{
    // ── Resolve o diretório do ano do contest visualizado ────────────────────────
    private function logsDir(): string
    {
        try {
            // Respeita o contest de visualização selecionado na sessão
            $cvId = session('contest_visualizacao_id');
            $contest = $cvId
                ? \App\Models\ContestDate::find($cvId)
                : ContestDate::ativo();
            $ano = $contest?->start_date
                ? \Carbon\Carbon::parse($contest->start_date)->year
                : (int) date('Y');
        } catch (\Throwable) {
            $ano = (int) date('Y');
        }
        return config('contest.logs_base_dir') . DIRECTORY_SEPARATOR . $ano;
    }
 
    // ── LOGs no banco (pós-importação) ────────────────────────────────────────
    public function index()
    {
        $arquivos = glob($this->logsDir() . DIRECTORY_SEPARATOR . '*.log') ?: [];
        $total    = count($arquivos);
        return view('logs.index', compact('total'));
    }
 
    public function recebidos()
    {
        return $this->index();
    }
 
    public function recebidosProcessar(Request $request)
    {
        $arquivos = glob($this->logsDir() . DIRECTORY_SEPARATOR . '*.log') ?: [];
        $total    = count($arquivos);
 
        if ($total === 0) {
            return response()->json(['ok'=>true,'logs'=>[],'total'=>0,'total_qsos_geral'=>0]);
        }
 
        $resultado = [];
 
        foreach ($arquivos as $filePath) {
            $nome     = basename($filePath);
            $callsign = ''; $categoria = ''; $banda = ''; $modo = '';
            $potencia = ''; $claimed   = 0;  $totalQsos = 0;
 
            try {
                $content = file_get_contents($filePath);
                $enc     = mb_detect_encoding($content, ['UTF-8','ISO-8859-1','WINDOWS-1252'], true);
                $content = mb_convert_encoding($content, 'UTF-8', $enc ?: 'UTF-8');
                $lines   = explode("\n", $content);
 
                foreach ($lines as $line) {
                    $line = trim($line);
                    if (str_starts_with($line, 'QSO:')) {
                        $totalQsos++;
                    } elseif (str_contains($line, ': ')) {
                        [$k, $v] = explode(': ', $line, 2);
                        $k = strtolower(trim(str_replace('-', '_', $k)));
                        $v = trim($v);
                        match($k) {
                            'callsign','call' => $callsign  = $v,
                            'category_operator' => $categoria = $v,
                            'category_band'     => $banda     = $v,
                            'category_mode'     => $modo      = $v,
                            'category_power'    => $potencia  = $v,
                            'claimed_score'     => $claimed   = (int)$v,
                            default             => null,
                        };
                    }
                }
            } catch (\Throwable) {}
 
            $resultado[] = [
                'arquivo'   => $nome,
                'callsign'  => $callsign ?: pathinfo($nome, PATHINFO_FILENAME),
                'categoria' => $categoria, 'banda' => $banda,
                'modo'      => $modo,      'potencia' => $potencia,
                'claimed'   => $claimed,   'qsos'    => $totalQsos,
            ];
        }
 
        usort($resultado, fn($a,$b) => strcmp($a['callsign'], $b['callsign']));
 
        return response()->json([
            'ok'              => true,
            'logs'            => $resultado,
            'total'           => $total,
            'total_qsos_geral'=> array_sum(array_column($resultado, 'qsos')),
        ]);
    }
 
    public function verLog(string $arquivo)
    {
        $nome    = basename($arquivo);
        $caminho = $this->logsDir() . DIRECTORY_SEPARATOR . $nome;
 
        if (!file_exists($caminho) || !str_ends_with(strtolower($nome), '.log')) {
            abort(404, 'Arquivo não encontrado.');
        }
 
        $conteudo = file_get_contents($caminho);
        $enc      = mb_detect_encoding($conteudo, ['UTF-8','ISO-8859-1','WINDOWS-1252'], true);
        $conteudo = mb_convert_encoding($conteudo, 'UTF-8', $enc ?: 'UTF-8');
 
        return view('logs.ver-log', compact('nome','conteudo'));
    }
 
    public function enviaLogs(Request $request)
    {
        // ── Usa o contest de visualização da sessão ────────────────────────────
        $cvId = session('contest_visualizacao_id');
        $cid  = $cvId ?? (ContestDate::ativo()?->id);
 
        $callsign = strtoupper(trim($request->input('callsign', '')));
        $modo     = $request->input('modo', 'visualizar');
 
        // Não mais necessário carregar lista para dropdown — campo é input livre
        $dados = null; $email = null; $msgEnvio = null;
 
        if ($callsign) {
            $qsosQ = DB::table('qsos_result')
                ->where('call_sent', $callsign)
                ->select('call_rcvd','date_time','exch_sent','exch_rcvd',
                         'category_power','category_band','category_mode',
                         'frequency','band','valid_qso','valid_tempqso',
                         'valid_trocaband','confirmado','motivo')
                ->orderBy('confirmado','desc')->orderBy('date_time');
            if ($cid) { $qsosQ->where('contest_id', $cid); }
            $qsos = $qsosQ->get();
 
            $rfQ = DB::table('resultados_final')->where('callsign', $callsign);
            if ($cid) { $rfQ->where('contest_id', $cid); }
            $resultado = $rfQ->first();
 
            $cabQ = DB::table('logs_cabecalhos')->where('callsign', $callsign);
            if ($cid) { $cabQ->where('contest_id', $cid); }
            $cab = $cabQ->first();
 
            $email = $cab?->email ?? null;
 
            $dados = [
                'callsign'    => $callsign,
                'nome'        => $resultado?->nome ?? $cab?->name ?? '—',
                'confirmados' => $qsos->where('confirmado', 1)->values(),
                'invalidos'   => $qsos->where('confirmado', 0)->values(),
                'resultado'   => $resultado,
            ];
 
            if ($modo === 'enviar' && $email && filter_var($email, FILTER_VALIDATE_EMAIL)) {
                try {
                    Mail::send('emails.relatorio-log', $dados,
                        fn($m) => $m->to($email)
                            ->subject("Relatório do seu LOG — {$callsign} | LABRE-DX Contest")
                            ->from(config('mail.from.address'), 'CONTEST LABRE-DX')
                    );
                    $msgEnvio = ['tipo' => 'ok', 'msg' => "Relatório enviado para {$email}"];
                } catch (\Throwable $e) {
                    $msgEnvio = ['tipo' => 'erro', 'msg' => "Falha ao enviar: " . $e->getMessage()];
                }
            } elseif ($modo === 'enviar') {
                $msgEnvio = ['tipo' => 'aviso', 'msg' => !$email
                    ? "Nenhum e-mail cadastrado para {$callsign}."
                    : "E-mail inválido: {$email}"];
            }
        }
 
        return view('logs.envia-logs', compact('callsign','dados','email','modo','msgEnvio'));
    }
 
 
}
