<?php

/*
 * This file is part of the Serenity package.
 *
 * (c) CP Creation <web@cpcreation.fr>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Serenity\CoreBundle\Shared\EventListener\Twig;

use Symfony\Component\EventDispatcher\Attribute\AsEventListener;
use Symfony\UX\TwigComponent\Event\PreRenderEvent;

/**
 * Permet la surcharge dynamique du template d’un composant Twig.
 *
 * Si une variable `template` est transmise au composant, ce listener
 * remplace le template par celui spécifié avant le rendu final.
 *
 * Utile pour personnaliser l’affichage d’un composant sans modifier
 * sa définition d’origine.
 */
#[AsEventListener(event: PreRenderEvent::class)]
final class ComponentTemplateOverrideListener
{
    public function __invoke(PreRenderEvent $event): void
    {
        $vars = $event->getVariables();

        // Évite les ré-applications en cascade
        if (($vars['_template_overridden'] ?? false) === true) {
            return;
        }

        $template = $vars['template'] ?? null;
        if (!\is_string($template) || '' === $template) {
            return;
        }

        // IMPORTANT :
        // - si embedded => conserver l'index, sinon setTemplate() change le parentTemplateForEmbedded
        $event->setTemplate($template, $event->getTemplateIndex());

        // consommer template pour qu'il ne se propage pas aux enfants/includes
        unset($vars['template']);
        $vars['_template_overridden'] = true;

        $event->setVariables($vars);
    }
}
