<?php

namespace App\Console\Commands;

use Illuminate\Console\Command;
use App\Models\Evento;
use App\Models\EquipoSeguimiento;
use App\Services\NotificacionService;
use Carbon\Carbon;
use Illuminate\Support\Facades\DB;

class RecordatorioPartidos extends Command
{
    protected $signature   = 'notificaciones:recordatorio-partido {--test : Simula sin guardar}';
    protected $description = 'Envía recordatorios 48hs antes de cada partido a sus seguidores';

    public function handle(NotificacionService $notifService): int
    {
        $desde = Carbon::now()->addHours(24);
        $hasta = Carbon::now()->addHours(50); // ventana de ~26hs para no perder ninguno

        $eventos = Evento::with(['equipoLocal.club', 'equipoVisitante.club'])
            ->whereNotNull('id_equipo_local')
            ->whereNotNull('id_equipo_visitante')
            ->whereBetween('fecha_evento', [$desde->toDateString(), $hasta->toDateString()])
            ->get();

        if ($eventos->isEmpty()) {
            $this->info('No hay partidos en las próximas 48hs.');
            return self::SUCCESS;
        }

        $totalNotif = 0;

        foreach ($eventos as $evento) {
            $nombreLocal     = $evento->equipoLocal->club->nombre  ?? '?';
            $nombreVisitante = $evento->equipoVisitante->club->nombre ?? '?';
            $fechaStr = $evento->fecha_evento->format('d/m/Y');
            $horaStr  = $evento->hora_inicio ? $evento->hora_inicio->format('H:i') : '';
            $sedeStr  = $evento->sede ? " | {$evento->sede}" : '';

            $titulo  = "⏰ Partido mañana: {$nombreLocal} vs {$nombreVisitante}";
            $mensaje = "Recordatorio: el partido es el {$fechaStr}" . ($horaStr ? " a las {$horaStr}" : '') . $sedeStr . '.';
            $url     = '/eventos/' . $evento->id_evento;

            // Recolectar destinatarios
            $idEquipos = array_filter([$evento->id_equipo_local, $evento->id_equipo_visitante]);
            $destinatarios = [];
            $yaAgregados   = [];

            $seguimientos = EquipoSeguimiento::whereIn('id_equipo', $idEquipos)->get();
            foreach ($seguimientos as $s) {
                $key = $s->tipo_usuario . ':' . $s->id_usuario;
                if (!isset($yaAgregados[$key])) {
                    $destinatarios[] = ['tipo' => $s->tipo_usuario, 'id' => $s->id_usuario];
                    $yaAgregados[$key] = true;
                }
            }

            $jugadores = \DB::table('jugador_equipo')
                ->whereIn('id_equipo', $idEquipos)
                ->pluck('id_jugador');

            foreach ($jugadores as $idJ) {
                $key = 'jugador:' . $idJ;
                if (!isset($yaAgregados[$key])) {
                    $destinatarios[] = ['tipo' => 'jugador', 'id' => $idJ];
                    $yaAgregados[$key] = true;
                }
            }

            if (empty($destinatarios)) continue;

            if ($this->option('test')) {
                $this->line("  [TEST] Evento {$evento->id_evento}: {$titulo} → " . count($destinatarios) . " destinatarios");
            } else {
                $notifService->enviarMasivo($destinatarios, 'partido', $titulo, $mensaje, $url);
            }

            $totalNotif += count($destinatarios);
        }

        $this->info("✅ Recordatorios enviados: {$eventos->count()} partidos, {$totalNotif} notificaciones.");
        return self::SUCCESS;
    }
}
