<?php

namespace App\EventSubscriber;

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

class LocaleListener implements EventSubscriberInterface
{
    private $defaultLocale;
    private $allowedLocales = ['fr', 'en','cn']; // Locales autorisées

    /**
     * @param string $defaultLocale La locale par défaut (configurée dans services.yaml)
     */
    public function __construct(string $defaultLocale = 'fr')
    {
        $this->defaultLocale = $defaultLocale;
    }

    /**
     * Définit la locale de la requête en fonction du paramètre 'lang' dans l'URL
     * ou de la locale stockée dans la session.
     */
    public function onKernelRequest(RequestEvent $event)
    {

        $request = $event->getRequest();

        // Si ce n'est pas la requête principale, on ne fait rien.
        if (!$event->isMainRequest()) {
            return;
        }

        $locale = $this->defaultLocale; // Locale par défaut si aucune autre n'est trouvée

        // --- NOUVELLE VÉRIFICATION DE SESSION ---
        // Vérifie si la session est disponible pour cette requête (par exemple, si elle est configurée)
        if ($request->hasSession()) {
            $session = $request->getSession();

            // 1. Chercher 'lang' dans les paramètres GET (?lang=en)
            $langFromQuery = $request->query->get('lang');

            if ($langFromQuery && in_array($langFromQuery, $this->allowedLocales)) {
                // Si 'lang' est présent et autorisé, l'utiliser et l'enregistrer dans la session
                $locale = $langFromQuery;
                // Clé de session standard pour la locale dans Symfony : '_locale'
                $session->set('_locale', $locale);
            } elseif ($session->has('_locale')) {
                // 2. Si aucun 'lang' valide n'est présent dans l'URL, vérifier la session
                $locale = $session->get('_locale');
            }
            // 3. Sinon, la locale reste la valeur par défaut initialisée plus haut.
        } else {
            // Si pas de session, on vérifie uniquement le paramètre 'lang' pour cette requête
            $langFromQuery = $request->query->get('lang');
            if ($langFromQuery && in_array($langFromQuery, $this->allowedLocales)) {
                $locale = $langFromQuery;
            }
        }

        // Définir la locale sur la requête.
        $request->setLocale($locale);
    }

    public static function getSubscribedEvents()
    {
        // On écoute l'événement de la requête (KernelEvents::REQUEST)
        // et on lui donne une priorité élevée (par exemple 20) pour qu'il s'exécute tôt.
        return [
            KernelEvents::REQUEST => [['onKernelRequest', 20]],
        ];
    }
}
