<?php
namespace App\Http\Middleware;

use App\Models\ContestDate;
use Closure;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\View;

/**
 * ContestViewContext
 *
 * Injeta em TODAS as views autenticadas:
 *
 *   $contestAtivo       — ContestDate com flag=1 (para processamento)
 *   $contestVisualizar  — ContestDate selecionado para relatórios/consultas
 *   $todosContests      — coleção para preencher o seletor
 *   $emProcessamento    — bool (mantém compatibilidade com layout)
 *
 * O contest de visualização é resolvido assim (em ordem de prioridade):
 *   1. Parâmetro GET  ?cv=<id>  → salva na sessão
 *   2. Sessão         contest_visualizacao_id
 *   3. Contest ativo  (flag=1)
 *   4. Contest mais recente (encerrado/arquivado)
 */
class ContestViewContext
{
    public function handle(Request $request, Closure $next)
    {
        // ── Troca de contest via GET ?cv=<id> ─────────────────────────────
        if ($request->has('cv') && is_numeric($request->query('cv'))) {
            session(['contest_visualizacao_id' => (int)$request->query('cv')]);
            // Redireciona removendo o parâmetro ?cv da URL para não poluir
            $params = $request->except('cv');
            return redirect($request->path() . ($params ? '?' . http_build_query($params) : ''));
        }

        // ── Contest ativo (para processamento) ────────────────────────────
        $contestAtivo = ContestDate::ativo();

        // ── Todos os contests (para o seletor) ────────────────────────────
        try {
            $todosContests = ContestDate::orderByDesc('id')->get();
        } catch (\Throwable) {
            $todosContests = collect();
        }

        // ── Contest de visualização ────────────────────────────────────────
        $cvId = session('contest_visualizacao_id');

        if ($cvId) {
            $contestVisualizar = $todosContests->firstWhere('id', $cvId);
        }

        if (empty($contestVisualizar)) {
            // Padrão: ativo → mais recente encerrado/arquivado
            $contestVisualizar = $contestAtivo
                ?? $todosContests->sortByDesc('id')->first();

            if ($contestVisualizar) {
                session(['contest_visualizacao_id' => $contestVisualizar->id]);
            }
        }

        // ── emProcessamento (mantém compatibilidade com layout existente) ──
        try {
            $emProcessamento = DB::table('contest_etapas')
                ->where('status', 'processando')
                ->exists();
        } catch (\Throwable) {
            $emProcessamento = false;
        }

        // ── Injeta em todas as views ───────────────────────────────────────
        View::share('contestAtivo',      $contestAtivo);
        View::share('contestVisualizar', $contestVisualizar);
        View::share('todosContests',     $todosContests);
        View::share('emProcessamento',   $emProcessamento);

        return $next($request);
    }
}
