<?php
namespace Tests\Unit\Performance;

use App\Models\Candidat;
use App\Models\Besoin;
use App\Models\Mission;
use App\Models\Ville;
use Illuminate\Foundation\Testing\RefreshDatabase;
use Illuminate\Support\Facades\DB;
use Tests\TestCase;

class EagerLoadingTest extends TestCase
{
    use RefreshDatabase;

    public function test_liste_candidats_neffectue_pas_requetes_n_plus_1(): void
    {
        // Créer 5 candidats (chacun avec sa ville via la factory)
        Candidat::factory()->count(5)->create();

        DB::flushQueryLog();
        DB::enableQueryLog();

        // Simuler la liste admin (avec eager loading)
        Candidat::with(['user', 'ville'])->get();

        $queries = DB::getQueryLog();
        DB::disableQueryLog();

        // 1 requête candidats + 1 users + 1 villes = 3 max (pas N+1)
        $this->assertLessThanOrEqual(
            5,
            count($queries),
            'Trop de requêtes SQL détectées — probable N+1 dans la liste candidats. ' .
            'Nombre de requêtes : ' . count($queries)
        );
    }

    public function test_liste_besoins_neffectue_pas_requetes_n_plus_1(): void
    {
        Besoin::factory()->count(5)->create();

        DB::flushQueryLog();
        DB::enableQueryLog();

        Besoin::with(['client', 'ville', 'quartier'])->get();

        $queries = DB::getQueryLog();
        DB::disableQueryLog();

        $this->assertLessThanOrEqual(
            5,
            count($queries),
            'Trop de requêtes SQL dans la liste besoins. Nombre : ' . count($queries)
        );
    }

    public function test_liste_missions_neffectue_pas_requetes_n_plus_1(): void
    {
        Mission::factory()->count(5)->create();

        DB::flushQueryLog();
        DB::enableQueryLog();

        Mission::with(['candidat.user', 'besoin.client'])->get();

        $queries = DB::getQueryLog();
        DB::disableQueryLog();

        $this->assertLessThanOrEqual(
            8,
            count($queries),
            'Trop de requêtes SQL dans la liste missions. Nombre : ' . count($queries)
        );
    }
}
