<?php

declare(strict_types=1);

namespace Fennec\Middleware;

use Fennec\Http\JsonResponse;
use Fennec\Http\Request;

/**
 * Exécute une liste ordonnée de middlewares autour d'un handler final.
 *
 * Ne décide pas quels middlewares s'appliquent à quelle route — reçoit une liste déjà
 * arrêtée (par le Firewall, à terme) et se contente de l'exécuter dans l'ordre.
 */
final class MiddlewarePipeline
{
    /**
     * @param list<MiddlewareInterface> $middlewares
     */
    public function __construct(private readonly array $middlewares)
    {
    }

    /**
     * @param \Closure(Request): JsonResponse $finalHandler Typiquement l'appel au controller résolu.
     */
    public function handle(Request $request, \Closure $finalHandler): JsonResponse
    {
        $next = $finalHandler;

        foreach (\array_reverse($this->middlewares) as $middleware) {
            $next = static fn (Request $request): JsonResponse => $middleware->process($request, $next);
        }

        return $next($request);
    }
}
