<?php

namespace App\EventSubscriber;

use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\HttpKernel\Event\ResponseEvent;
use Symfony\Component\HttpKernel\KernelEvents;

/**
 * En-têtes de sécurité HTTP appliqués à toutes les réponses
 * (équivalent des headers définis dans next.config.js de l'app d'origine).
 */
final class SecurityHeadersSubscriber implements EventSubscriberInterface
{
    public static function getSubscribedEvents(): array
    {
        return [KernelEvents::RESPONSE => 'onResponse'];
    }

    public function onResponse(ResponseEvent $event): void
    {
        if (!$event->isMainRequest()) {
            return;
        }

        $headers = $event->getResponse()->headers;
        $headers->set('X-Frame-Options', 'DENY');
        $headers->set('X-Content-Type-Options', 'nosniff');
        $headers->set('Referrer-Policy', 'same-origin');
        // Force le navigateur à n'utiliser que HTTPS pendant 1 an (HSTS).
        $headers->set('Strict-Transport-Security', 'max-age=31536000; includeSubDomains');
        // Désactive les APIs sensibles inutiles à l'app.
        $headers->set('Permissions-Policy', 'microphone=(), payment=(), usb=()');
        // Masque la version PHP (info-leak mineur).
        $headers->remove('X-Powered-By');

        // NOTE CSP : une Content-Security-Policy avait été ajoutée puis RETIRÉE (2026-06-29)
        // car elle cassait le chargement des modules Stimulus (importmap AssetMapper +
        // es-module-shims) → JS muet → formulaires inertes. À reposer plus tard, AVEC test
        // navigateur (prévoir 'unsafe-eval'/origine du polyfill pour l'importmap, ou un nonce).
    }
}
