<?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\Next;
use App\Framework\Http\RequestStateManager;
use App\Framework\Http\Response;
use App\Framework\Http\ResponseManipulator;

#[MiddlewarePriorityAttribute(MiddlewarePriority::CORS)]
final readonly class CORSMiddleware implements HttpMiddleware
{
    public function __construct(
        private ResponseManipulator $manipulator
    ) {
    }

    public function __invoke(MiddlewareContext $context, Next $next, RequestStateManager $stateManager): MiddlewareContext
    {
        // Debug-Ausgabe vor der Verarbeitung
        #var_dump('CORS Middleware Start - Kontext hat Response: ' . ($context->hasResponse() ? 'ja' : 'nein'));

        // Nächste Middleware aufrufen UND den Kontext mit der Response behalten
        $resultContext = $next($context);

        // Debug-Ausgabe nach der Verarbeitung
        #var_dump('CORS Middleware End - Kontext hat Response: ' . ($resultContext->hasResponse() ? 'ja' : 'nein'));

        // Wenn eine Response vorhanden ist, CORS-Header hinzufügen
        if ($resultContext->hasResponse()) {
            $response = $resultContext->response;

            // Aktualisierte Headers erstellen
            $updatedHeaders = $response->headers->with('Access-Control-Allow-Origin', '*');
            $updatedHeaders = $updatedHeaders->with('Access-Control-Allow-Methods', 'GET, POST, PUT, DELETE, OPTIONS');
            $updatedHeaders = $updatedHeaders->with('Access-Control-Allow-Headers', 'Content-Type, Authorization');

            // Neue Response mit aktualisierten Headers erstellen
            $updatedResponse = $this->manipulator->withHeaders($response, $updatedHeaders);

            // Kontext mit der aktualisierten Response zurückgeben
            return $resultContext->withResponse($updatedResponse);
        }

        // Wenn keine Response vorhanden ist, Kontext unverändert zurückgeben
        return $resultContext;

    }
}
