<?php

declare(strict_types=1);

namespace App\Core;

final class View
{
    public static function render(string $view, array $data = []): void
    {
        extract($data, EXTR_SKIP);
        $viewFile = VIEW_PATH . '/' . $view . '.php';

        if (!file_exists($viewFile)) {
            throw new \RuntimeException("Vue introuvable : {$view}");
        }

        $layoutName = isset($layout) && is_string($layout) ? $layout : 'main';

        // Autorise uniquement un nom de layout simple (lettres, chiffres, tiret, underscore).
        if (!preg_match('/^[A-Za-z0-9_-]+$/', $layoutName)) {
            $layoutName = 'main';
        }

        $layoutFile = VIEW_PATH . '/layouts/' . $layoutName . '.php';
        if (!is_file($layoutFile)) {
            $layoutFile = VIEW_PATH . '/layouts/main.php';
        }

        ob_start();
        require $layoutFile;
        $html = (string)ob_get_clean();

        /*
         * Injecte automatiquement le jeton CSRF dans tous les formulaires POST.
         * Les vues existantes restent ainsi compatibles sans modification fichier par fichier.
         */
        $csrfField = Csrf::field();
        $html = (string)preg_replace_callback(
            '/<form\b(?=[^>]*\bmethod\s*=\s*(["\'])post\1)[^>]*>/i',
            static fn (array $matches): string => $matches[0] . $csrfField,
            $html
        );

        echo $html;
    }
}
