<?php

namespace Tests\Feature;

use App\Models\Role;
use App\Models\Utilisateur;
use Illuminate\Foundation\Testing\RefreshDatabase;
use Illuminate\Support\Facades\Hash;
use Tests\TestCase;

class SecuriteTest extends TestCase
{
    use RefreshDatabase;

    /**
     * Vérifie que les en-têtes de sécurité sont bien présents sur les réponses.
     */
    public function test_les_entetes_de_securite_sont_presents(): void
    {
        $response = $this->get('/');

        $response->assertStatus(200);
        $response->assertHeader('X-Content-Type-Options', 'nosniff');
        $response->assertHeader('X-Frame-Options', 'SAMEORIGIN');
        $response->assertHeader('Referrer-Policy', 'strict-origin-when-cross-origin');
        $response->assertHeader('Content-Security-Policy');
        $response->assertHeader('Permissions-Policy');
    }

    /**
     * Vérifie que les pages protégées redirigent un visiteur non authentifié
     * vers la page de connexion (contrôle d'accès).
     */
    public function test_les_pages_protegees_exigent_une_authentification(): void
    {
        $response = $this->get('/profile/settings');

        $response->assertRedirect('/login');
    }

    /**
     * Vérifie le droit à l'effacement RGPD : la suppression du compte
     * anonymise bien les données personnelles de l'utilisateur.
     */
    public function test_la_suppression_de_compte_anonymise_les_donnees(): void
    {
        $role = Role::create(['Nom' => 'Utilisateur']);

        $user = Utilisateur::create([
            'Pseudo' => 'JeanDupont',
            'Email' => 'jean.dupont@example.com',
            'MotDePasse' => Hash::make('motdepasse123'),
            'ID_Role' => $role->ID_Role,
            'Statut' => 'Actif',
        ]);

        $response = $this->actingAs($user)->delete('/profile', [
            'MotDePasse_Confirmation' => 'motdepasse123',
        ]);

        $response->assertRedirect('/');

        $user->refresh();
        $this->assertSame('Utilisateur supprimé', $user->Pseudo);
        $this->assertSame('Inactif', $user->Statut);
        $this->assertStringNotContainsString('jean.dupont', $user->Email);
    }
}
