<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use App\Models\Equipo;
use App\Models\EquipoSeguimiento;
use App\Models\Evento;
use App\Services\NotificacionService;

class SeguimientoController extends Controller
{
    private NotificacionService $notifService;

    public function __construct(NotificacionService $notifService)
    {
        $this->notifService = $notifService;
    }

    private function getUserSession(): ?array
    {
        if (!session()->has('user_logged_in')) return null;
        return ['tipo' => session('user_tipo'), 'id' => session('user_id')];
    }

    /**
     * POST /seguimiento/equipo/{id} — Toggle: seguir o dejar de seguir un equipo
     */
    public function toggle(int $id)
    {
        $u = $this->getUserSession();
        if (!$u) {
            return response()->json(['ok' => false, 'msg' => 'Debés iniciar sesión para seguir equipos.'], 401);
        }

        $equipo = Equipo::find($id);
        if (!$equipo) {
            return response()->json(['ok' => false, 'msg' => 'Equipo no encontrado.'], 404);
        }

        $existing = EquipoSeguimiento::where('id_equipo', $id)
            ->where('tipo_usuario', $u['tipo'])
            ->where('id_usuario', (string)$u['id'])
            ->first();

        if ($existing) {
            $existing->delete();
            return response()->json(['ok' => true, 'siguiendo' => false, 'msg' => 'Dejaste de seguir este equipo.']);
        }

        EquipoSeguimiento::create([
            'id_equipo'   => $id,
            'tipo_usuario'=> $u['tipo'],
            'id_usuario'  => (string)$u['id'],
            'created_at'  => now(),
        ]);

        return response()->json(['ok' => true, 'siguiendo' => true, 'msg' => '¡Ahora seguís este equipo!']);
    }

    /**
     * GET /seguimiento/mis-equipos — Devuelve equipos seguidos y próximos partidos
     */
    public function misEquipos()
    {
        $u = $this->getUserSession();
        if (!$u) return response()->json(['equipos' => []]);

        $seguimientos = EquipoSeguimiento::with(['equipo.club'])
            ->where('tipo_usuario', $u['tipo'])
            ->where('id_usuario', (string)$u['id'])
            ->get();

        $equiposIds = $seguimientos->pluck('id_equipo');

        // Próximos partidos de los equipos seguidos
        $proximosPartidos = Evento::with(['equipoLocal.club', 'equipoVisitante.club'])
            ->where('fecha_evento', '>=', now()->toDateString())
            ->where(function ($q) use ($equiposIds) {
                $q->whereIn('id_equipo_local', $equiposIds)
                  ->orWhereIn('id_equipo_visitante', $equiposIds);
            })
            ->orderBy('fecha_evento')
            ->orderBy('hora_inicio')
            ->limit(10)
            ->get();

        return response()->json([
            'equipos'          => $seguimientos->map(fn($s) => [
                'id'       => $s->id_equipo,
                'nombre'   => ($s->equipo->club->nombre ?? 'Equipo') . ' ' . $s->equipo->categoria . ($s->equipo->division ? ' ' . $s->equipo->division : ''),
                'club'     => $s->equipo->club->nombre ?? '—',
                'categoria'=> $s->equipo->categoria,
                'division' => $s->equipo->division,
            ]),
            'proximos_partidos' => $proximosPartidos->map(fn($e) => [
                'id'       => $e->id_evento,
                'fecha'    => $e->fecha_evento->format('d/m/Y'),
                'hora'     => $e->hora_inicio ? $e->hora_inicio->format('H:i') : '',
                'local'    => $e->equipoLocal->club->nombre ?? '?',
                'visitante'=> $e->equipoVisitante->club->nombre ?? '?',
                'sede'     => $e->sede,
            ]),
        ]);
    }

    /**
     * GET /seguimiento/estado/{id_equipo} — ¿El usuario sigue este equipo?
     */
    public function estado(int $id)
    {
        $u = $this->getUserSession();
        if (!$u) return response()->json(['siguiendo' => false]);

        $siguiendo = EquipoSeguimiento::where('id_equipo', $id)
            ->where('tipo_usuario', $u['tipo'])
            ->where('id_usuario', (string)$u['id'])
            ->exists();

        return response()->json(['siguiendo' => $siguiendo]);
    }
}
