<?php
declare(strict_types=1);

namespace App\Framework\Http\Emitter;

use App\Framework\Http\Emitter\Emitter;
use App\Framework\Http\Response;

final class HttpEmitter implements Emitter
{

    public function emit(Response $response): void
    {
        // 1. Robustheit: Prüfen, ob Header bereits gesendet wurden.
        if (headers_sent($file, $line)) {
            throw new \RuntimeException("Kann die Antwort nicht senden: Header wurden bereits in {$file}:{$line} gesendet.");
        }

        // 2. Robustheit: Jeglichen zuvor gepufferten Output löschen, um unbeabsichtigte Ausgaben zu vermeiden.
        if (ob_get_level() > 0 && ob_get_length() > 0) {
            ob_clean();
        }

        // Status-Code senden
        http_response_code($response->status->value);

        // 4. Header senden (korrigierte und vereinfachte Logik)
        foreach ($response->headers->all() as $name => $value) {
            // Der `Set-Cookie`-Header ist ein Sonderfall und darf nicht kombiniert werden.
            if (strtolower($name) === 'set-cookie') {
                foreach ((array)$value as $cookie) {
                    header("Set-Cookie: $cookie", false);
                }
                // Wichtig: Mit dem nächsten Header fortfahren, um doppeltes Senden zu verhindern.
                continue;
            }

            // Alle anderen Header mit mehreren Werten können kombiniert werden.
            $headerValue = is_array($value) ? implode(', ', $value) : $value;
            header("$name: $headerValue", true);
        }

        // Body ausgeben
        echo $response->body;
    }
}
