<?php

namespace App\Http\Middleware;

use Closure;
use Illuminate\Http\Request;
use Symfony\Component\HttpFoundation\Response;

class SecurityHeaders
{
    /**
     * Handle an incoming request.
     */
    public function handle(Request $request, Closure $next): Response
    {
        $response = $next($request);

        // --- En-têtes de sécurité HTTP (défense en profondeur) ---

        // Force le navigateur à n'utiliser que HTTPS pendant 1 an (protection contre le SSL stripping).
        $response->headers->set('Strict-Transport-Security', 'max-age=31536000; includeSubDomains', true);

        // Empêche le navigateur de "deviner" le type MIME d'une ressource (protection contre le MIME sniffing).
        $response->headers->set('X-Content-Type-Options', 'nosniff', true);

        // Interdit l'affichage du site dans une iframe externe (protection contre le clickjacking).
        $response->headers->set('X-Frame-Options', 'SAMEORIGIN', true);

        // Ancienne protection XSS des navigateurs (conservée pour les navigateurs anciens).
        $response->headers->set('X-XSS-Protection', '1; mode=block', true);

        // Limite les informations de provenance envoyées aux sites tiers.
        $response->headers->set('Referrer-Policy', 'strict-origin-when-cross-origin', true);

        // Désactive des API sensibles du navigateur non utilisées par l'application (RGPD / vie privée).
        $response->headers->set('Permissions-Policy', 'geolocation=(), microphone=(), camera=(), payment=()', true);

        // Content-Security-Policy : réduit fortement le risque d'injection de scripts (XSS).
        // Politique volontairement compatible avec Laravel/Vite (styles et scripts inline autorisés).
        // Pour durcir davantage, remplacer 'unsafe-inline' par un système de nonce.
        // NB : l'application charge Tailwind via CDN (cdn.tailwindcss.com) et
        // les avatars via ui-avatars.com : ces sources externes sont donc autorisées.
        $response->headers->set('Content-Security-Policy', implode('; ', [
            "default-src 'self'",
            "script-src 'self' 'unsafe-inline' https://cdn.tailwindcss.com",
            "style-src 'self' 'unsafe-inline' https://cdn.tailwindcss.com",
            "img-src 'self' data: https:",
            "font-src 'self' data:",
            "connect-src 'self'",
            "object-src 'none'",
            "base-uri 'self'",
            "frame-ancestors 'self'",
        ]), true);

        return $response;
    }
}
