<?php
namespace App\Console\Commands;

use App\Models\ContestDate;
use Illuminate\Console\Command;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Mail;

class AtivarContest extends Command
{
    protected $signature   = 'contest:ativar {--force : Força ativação mesmo que auto_ativar esteja desligado}';
    protected $description = 'Verifica se algum contest Futuro deve ser ativado hoje';

    public function handle(): int
    {
        if (!config('contest.auto_ativar', false) && !$this->option('force')) {
            $this->line('Ativação automática desligada (AUTO_ATIVAR_CONTEST=false).');
            $this->line('Use --force para ativar manualmente via CLI, ou ligue pela tela de Gestão de Contests.');
            return 0;
        }

        // Se já tem um contest ativo, nada a fazer
        $ativo = ContestDate::ativo();
        if ($ativo && !$this->option('force')) {
            $this->line("Contest já ativo: #{$ativo->id} {$ativo->name} {$ativo->start_date->format('Y')}.");
            return 0;
        }

        $hoje = now()->startOfDay();

        // Buscar contest Futuro cujo inicio_log chegou
        $candidato = DB::table('contest_date')
            ->where('flag', ContestDate::FLAG_FUTURO)
            ->where('inicio_log', '<=', $hoje->toDateString())
            ->orderBy('id')
            ->first();

        if (!$candidato) {
            $this->line('Nenhum contest Futuro com inicio_log <= hoje encontrado.');
            return 0;
        }

        DB::transaction(function () use ($candidato) {
            // Suspender o ativo atual se houver (por segurança)
            DB::table('contest_date')
                ->where('flag', ContestDate::FLAG_ATIVO)
                ->update(['flag' => ContestDate::FLAG_ENCERRADO]);

            // Ativar o candidato
            DB::table('contest_date')
                ->where('id', $candidato->id)
                ->update(['flag' => ContestDate::FLAG_ATIVO]);

            // Garantir etapas criadas para este contest
            $existentes = DB::table('contest_etapas')
                ->where('contest_id', $candidato->id)->pluck('etapa')->toArray();

            $etapasNomes = [
                'A'=>'Importar LOGs','1'=>'Juntar LOGs','2'=>'Validar QSOs',
                '3'=>'Validar Tempo/Banda','4'=>'Claimed Score','5'=>'Validar Contatos',
                '6'=>'Sem LOGs / DUPs','7'=>'Pontos+Multi+FS','8'=>'Final Score',
                '9'=>'Resultado Final','10'=>'Records','11'=>'Encerrar Contest',
            ];
            foreach ($etapasNomes as $e => $n) {
                if (!in_array($e, $existentes)) {
                    DB::table('contest_etapas')->insert([
                        'etapa'=>$e,'nome'=>$n,'contest_id'=>$candidato->id,
                        'status'=>'pendente','segundos_gastos'=>0,
                    ]);
                }
            }
        });

        $this->info("✅ Contest #{$candidato->id} ({$candidato->name} {$candidato->start_date}) ativado.");

        // Garantir que o diretório do ano ativo existe
        $ano    = \Carbon\Carbon::parse($candidato->start_date)->year;
        $dirLog = config('contest.logs_base_dir') . DIRECTORY_SEPARATOR . $ano;
        if (!is_dir($dirLog)) {
            mkdir($dirLog, 0755, true);
            $this->line("📁 Diretório criado: inputs/LOGsRecebidosPorAno/{$ano}/");
        }

        // Notificar por e-mail
        try {
            Mail::raw(
                "Contest ativado automaticamente pelo cron:\n\n" .
                "ID: {$candidato->id}\nNome: {$candidato->name}\n" .
                "Início: {$candidato->start_date}\nInício LOG: {$candidato->inicio_log}\n" .
                "Ativado em: " . now()->format('d/m/Y H:i'),
                fn($m) => $m
                    ->to(config('mail.from.address'))
                    ->subject('LABRE-DX — Contest Ativado Automaticamente')
            );
        } catch (\Throwable) {}

        return 0;
    }
}
