<?php
namespace App\Models;
 
use Illuminate\Database\Eloquent\Model;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\DB;
 
class ContestEtapa extends Model
{
    protected $table        = 'contest_etapas';
    protected $primaryKey   = 'etapa';      // PK composta: (etapa, contest_id)
    public    $incrementing = false;
    protected $keyType      = 'string';
    public    $timestamps   = false;
    protected $guarded      = [];
 
    protected $casts = [
        'iniciada_em'       => 'datetime',
        'executada_em'      => 'datetime',
        'total_processados' => 'integer',
        'total_validos'     => 'integer',
        'total_invalidos'   => 'integer',
        'segundos_gastos'   => 'integer',
        'contest_id'        => 'integer',
    ];
 
    const ORDEM = ['A','1','2','3','4','5','6','7','8','9','10','11'];
 
    /** Query base filtrada pelo contest ativo */
    private static function queryAtivo(): \Illuminate\Database\Eloquent\Builder
    {
        $ativo = ContestDate::ativo();
        $q = static::orderByRaw("FIELD(etapa,'A','1','2','3','4','5','6','7','8','9','10','11')");
        return $ativo ? $q->where('contest_id', $ativo->id) : $q;
    }
 
    /** Marca etapa como concluída */
    public static function concluir(string $etapa, array $dados = []): void
    {
        $segundos = 0;
        if (!empty($dados['tempo_gasto'])) {
            $t = trim($dados['tempo_gasto']);
            if      (preg_match('/^([\d.]+)\s*min/', $t, $m))  $segundos = (int)round((float)$m[1] * 60);
            elseif  (preg_match('/^([\d.]+)\s*seg?/', $t, $m)) $segundos = (int)round((float)$m[1]);
        }
 
        $ativo  = ContestDate::ativo();
        $filter = ['etapa' => $etapa];
        if ($ativo) $filter['contest_id'] = $ativo->id;
 
        DB::table('contest_etapas')->where($filter)->update([
            'status'            => 'concluida',
            'executada_em'      => now(),
            'executada_por'     => Auth::user()?->name ?? 'sistema',
            'tempo_gasto'       => $dados['tempo_gasto']      ?? null,
            'segundos_gastos'   => $segundos,
            'total_processados' => $dados['total_processados'] ?? 0,
            'total_validos'     => $dados['total_validos']     ?? 0,
            'total_invalidos'   => $dados['total_invalidos']   ?? 0,
        ]);
    }
 
    /** Mapa etapa => status do contest ativo */
    public static function mapaStatus(): array
    {
        return static::queryAtivo()->get()->pluck('status', 'etapa')->toArray();
    }
 
    /** Todas as etapas com tempo do contest ativo */
    public static function todasComTempo(): \Illuminate\Support\Collection
    {
        return static::queryAtivo()->get();
    }
 
    /** Total de segundos das etapas concluídas do contest ativo */
    public static function totalSegundos(): int
    {
        $ativo = ContestDate::ativo();
        $q = static::where('status', 'concluida');
        if ($ativo) $q->where('contest_id', $ativo->id);
        return (int)$q->sum('segundos_gastos');
    }
 
    /** Verifica se a etapa anterior está concluída */
    public static function anteriorConcluida(string $etapa): bool
    {
        $idx = array_search($etapa, self::ORDEM);
        if ($idx === 0) return true;
        $anterior = self::ORDEM[$idx - 1];
        $ativo = ContestDate::ativo();
        $q = static::where('etapa', $anterior)->where('status', 'concluida');
        if ($ativo) $q->where('contest_id', $ativo->id);
        return $q->exists();
    }
}