<?php

namespace Tests\Feature;

use Illuminate\Foundation\Testing\DatabaseTransactions;
use Tests\TestCase;
use App\Models\Aficionado;
use App\Models\Evento;
use App\Models\QrCode;

class EventoQRTest extends TestCase
{
    use DatabaseTransactions;

    // No hay cambios requeridos aquí si es Aficionado, auto_increment está ON para id_aficionado.
    // Pero si algún dia usamos jugadores, recordamos usar id_jugador string.
    public function test_jugador_puede_solicitar_qr()
    {
        // 1. Crear un Club y un Jugador activo
        $club = \App\Models\Club::create(['nombre' => 'Club Test']);
        $idJugador = 'JUG_' . substr(uniqid(), 0, 15);
        $jugador = \App\Models\Jugador::create([
            'id_jugador'       => $idJugador,
            'nombre'           => 'Carlos',
            'apellido'         => 'Test',
            'documento'        => '12345678',
            'email'            => 'carlos@test.com',
            'password'         => bcrypt('password123'),
            'id_club_actual'   => $club->id_club,
            'activo'           => true
        ]);

        // 2. Crear un equipo del club
        $idEquipo = (int) (rand(1000, 9999));
        $equipo = \App\Models\Equipo::create([
            'id_club'   => $club->id_club,
            'categoria' => 'Mayores',
            'division'  => 'A'
        ]);

        // Vincular jugador al equipo
        \Illuminate\Support\Facades\DB::table('jugador_equipo')->insert([
            'id_jugador' => $jugador->id_jugador,
            'id_equipo'  => $equipo->id_equipo
        ]);

        // 3. Crear un evento donde juegue ese equipo
        $evento = Evento::create([
            'id_evento'        => 'EVE_' . substr(uniqid(), 0, 15),
            'nombre_evento'    => 'Partido Amistoso',
            'fecha_evento'     => now()->addDays(2)->format('Y-m-d'),
            'hora_inicio'      => '20:00',
            'hora_fin'         => '22:00',
            'id_equipo_local'  => $equipo->id_equipo,
            'id_equipo_visitante' => null,
            'limite_qr_jugador' => 3
        ]);

        // 4. Simular la sesión iniciada como jugador
        $this->withSession([
            'user_logged_in' => true,
            'user_tipo'      => 'jugador',
            'user_id'        => $jugador->id_jugador,
            'user_name'      => 'Carlos Test'
        ]);

        // 5. Hacer el request POST
        $response = $this->post(route('panel.solicitar.qr'), [
            'id_evento' => $evento->id_evento
        ]);

        // 6. Verificaciones
        $response->assertRedirect(route('panel.mis.qrs', ['evento' => $evento->id_evento]));
        $response->assertSessionHas('panel_msg');
        
        // Verificar que en la tabla 'qr_codes' existan los QRs
        $this->assertEquals(3, QrCode::where('id_evento', $evento->id_evento)
                                     ->where('id_jugador', $jugador->id_jugador)
                                     ->count());
    }

    public function test_jugador_no_puede_solicitar_dos_veces_qrs_para_mismo_evento()
    {
        $club = \App\Models\Club::create(['nombre' => 'Club Test']);
        $idJugador = 'JUG_' . substr(uniqid(), 0, 15);
        $jugador = \App\Models\Jugador::create([
            'id_jugador'       => $idJugador,
            'nombre'           => 'Carlos',
            'apellido'         => 'Test',
            'documento'        => '12345678',
            'email'            => 'carlos@test.com',
            'password'         => bcrypt('password123'),
            'id_club_actual'   => $club->id_club,
            'activo'           => true
        ]);

        $evento = Evento::create([
            'id_evento'     => 'EVE_' . substr(uniqid(), 0, 15),
            'nombre_evento' => 'Partido Amistoso',
            'fecha_evento'  => now()->addDays(2)->format('Y-m-d'),
            'hora_inicio'   => '18:00',
            'hora_fin'      => '20:00'
        ]);

        // Generar el primer QR directamente en BD simulando que ya lo pidió antes
        QrCode::create([
            'id_qr'              => 'qr_' . uniqid(),
            'id_evento'          => $evento->id_evento,
            'id_jugador'         => $jugador->id_jugador,
            'tipo_qr'            => 'invitado',
            'escaneos_restantes' => 1,
            'creado'             => now()
        ]);

        $this->withSession([
            'user_logged_in' => true,
            'user_tipo'      => 'jugador',
            'user_id'        => $jugador->id_jugador
        ]);

        $response = $this->post(route('panel.solicitar.qr'), [
            'id_evento' => $evento->id_evento
        ]);

        // Debería tirar mensaje de error de que ya solicitó
        $response->assertSessionHas('panel_error', 'Ya solicitaste QRs para este evento.');
        $this->assertEquals(1, QrCode::where('id_evento', $evento->id_evento)->count());
    }
}
