<?php

namespace App\Http\Controllers\Admin;

use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
use App\Models\Pase;
use App\Models\Jugador;
use App\Models\Club;

class PaseController extends Controller
{
    private function checkGeneralAdmin(Request $request)
    {
        if (!session('admin_logged_in') || !in_array(session('admin_role'), [1, 2])) {
            abort(403, 'Acceso denegado');
        }
    }

    private function checkSuperAdmin(Request $request)
    {
        if (!session('admin_logged_in') || session('admin_role') != 1) {
            abort(403, 'Acceso denegado. Solo Súper Administradores.');
        }
    }

    public function index(Request $request)
    {
        $this->checkGeneralAdmin($request);
        
        $query = Pase::with(['jugador', 'clubOrigen', 'clubDestino']);

        if (session('admin_role') == 2) {
            $idClub = session('admin_id_club');
            $query->where(function ($q) use ($idClub) {
                $q->where('id_club_origen', $idClub)
                  ->orWhere('id_club_destino', $idClub);
            });
        }

        $pases = $query->orderBy('created_at', 'desc')->paginate(20);
        return view('admin.pases.index', compact('pases'));
    }

    public function create(Request $request)
    {
        $this->checkGeneralAdmin($request);
        return view('admin.pases.create');
    }

    public function store(Request $request)
    {
        $this->checkGeneralAdmin($request);
        
        $request->validate([
            'documento' => 'required|string|exists:jugadores,documento'
        ], [
            'documento.exists' => 'No se encontró un jugador con ese DNI.'
        ]);

        $jugador = Jugador::where('documento', $request->documento)->first();

        // Si el jugador ya pertenece al club destino, error
        $idClubDestino = session('admin_role') == 2 ? session('admin_id_club') : $request->input('id_club_destino');
        
        if (!$idClubDestino) {
            return back()->withErrors(['id_club_destino' => 'Debe especificar el club destino.']);
        }

        if ($jugador->id_club_actual == $idClubDestino) {
            return back()->withErrors(['documento' => 'Este jugador ya pertenece a tu club.']);
        }

        // Crear la petición de pase
        Pase::create([
            'id_jugador' => $jugador->id_jugador,
            'id_club_origen' => $jugador->id_club_actual,
            'id_club_destino' => $idClubDestino,
            'estado' => 'Pendiente'
        ]);

        return redirect()->route('admin.pases.index')->with('admin_msg', 'Solicitud de pase creada correctamente y está pendiente de aprobación.');
    }

    public function aprobar(Request $request, $id)
    {
        $this->checkSuperAdmin($request);
        $pase = Pase::findOrFail($id);
        
        if ($pase->estado !== 'Pendiente') {
            return back()->withErrors(['pase' => 'Este pase ya fue procesado.']);
        }

        $pase->update(['estado' => 'Aprobado']);
        
        // Actualizar jugador
        if ($pase->jugador) {
            // Desvincular de equipos del club de origen
            $equiposOldClubIds = $pase->jugador->equipos()
                ->where('id_club', $pase->id_club_origen)
                ->pluck('equipos.id_equipo');

            if ($equiposOldClubIds->count() > 0) {
                $pase->jugador->equipos()->detach($equiposOldClubIds);
            }

            $pase->jugador->update([
                'id_club_origen' => $pase->id_club_origen,
                'id_club_actual' => $pase->id_club_destino
            ]);
        }

        return redirect()->route('admin.pases.index')->with('admin_msg', 'Pase aprobado correctamente y jugador desvinculado de equipos anteriores.');
    }

    public function rechazar(Request $request, $id)
    {
        $this->checkSuperAdmin($request);
        $pase = Pase::findOrFail($id);

        if ($pase->estado !== 'Pendiente') {
            return back()->withErrors(['pase' => 'Este pase ya fue procesado.']);
        }

        $pase->update(['estado' => 'Rechazado']);

        return redirect()->route('admin.pases.index')->with('admin_msg', 'Pase rechazado.');
    }
}
