<?php
declare(strict_types=1);

namespace App\Framework\Http\Middlewares;

use App\Framework\Http\HttpMiddleware;
use App\Framework\Http\MiddlewareContext;
use App\Framework\Http\MiddlewarePriority;
use App\Framework\Http\MiddlewarePriorityAttribute;
use App\Framework\Http\RequestStateManager;
use App\Framework\Router\RouteResponder;

#[MiddlewarePriorityAttribute(MiddlewarePriority::ROUTING, -1)]
final readonly class ResponseGeneratorMiddleware implements HttpMiddleware
{
    public function __construct(
        private RouteResponder $responder,
    ) {}

    public function __invoke(MiddlewareContext $context, callable $next, RequestStateManager $stateManager): MiddlewareContext
    {
        $request = $context->request;

        if($stateManager->has('controllerResult')) {
            $originalResponse = $this->responder->respond($stateManager->get('controllerResult'));

            // Kontext mit der generierten Response aktualisieren
            $updatedContext = $context->withResponse($originalResponse);



            $resultContext = $next($updatedContext);

            if(!$resultContext->hasResponse() && $originalResponse !== null) {
                return $resultContext->withResponse($originalResponse);
            }

            return $resultContext;
        }


        /*// Prüfen, ob es sich um einen angereicherten Request handelt
        if ($request instanceof EnrichedRequest && $request->result) {
            // Response aus dem Controller-Ergebnis generieren
            $originalResponse = $this->responder->respond($request->result);

            // Kontext mit der generierten Response aktualisieren
            $updatedContext = $context->withResponse($originalResponse);



            $resultContext = $next($updatedContext);

            if(!$resultContext->hasResponse() && $originalResponse !== null) {
                return $resultContext->withResponse($originalResponse);
            }

            return $resultContext;
        }*/

        // Immer die nächste Middleware aufrufen, auch wenn bereits eine Response generiert wurde
        return $next($context);
    }
}
