<?php
declare(strict_types=1);

namespace App\Framework\ErrorHandling;

use App\Framework\Http\Status;

/**
 * Hilfsklasse zur Konvertierung von Exceptions in HTTP-Status-Codes.
 */
final class ExceptionConverter
{
    /**
     * Bestimmt den HTTP-Status basierend auf dem Exception-Typ
     */
    public static function getStatusFromException(\Throwable $e): Status
    {
        return match (true) {
            // Routing-Fehler
            $e instanceof \App\Framework\Router\Exception\RouteNotFound => Status::NOT_FOUND,
            $e instanceof \App\Framework\Router\Exception\MethodNotAllowed => Status::METHOD_NOT_ALLOWED,

            // Validierungs-Fehler
            $e instanceof \App\Framework\Validation\Exceptions\ValidationException => Status::BAD_REQUEST,

            // API-Fehler
            $e instanceof \App\Framework\Api\ApiException => Status::BAD_GATEWAY,

            // Datenbank-Fehler
            $e instanceof \PDOException => Status::INTERNAL_SERVER_ERROR,

            // Standard
            default => Status::INTERNAL_SERVER_ERROR,
        };
    }

    /**
     * Erstellt den Response-Body basierend auf der Exception
     */
    public static function getResponseBody(\Throwable $e, bool $debug = false, ?string $requestId = null): array
    {
        if ($debug) {
            // Im Debug-Modus detaillierte Informationen zurückgeben
            return [
                'error' => true,
                'message' => $e->getMessage(),
                'file' => $e->getFile(),
                'line' => $e->getLine(),
                'trace' => explode("\n", $e->getTraceAsString()),
                'request_id' => $requestId,
            ];
        }

        // Im Produktionsmodus nur minimale Informationen
        return [
            'error' => true,
            'message' => self::getUserFriendlyMessage($e),
            'request_id' => $requestId,
        ];
    }

    /**
     * Gibt eine benutzerfreundliche Fehlermeldung basierend auf dem Exception-Typ zurück
     */
    public static function getUserFriendlyMessage(\Throwable $e): string
    {
        return match (true) {
            $e instanceof \App\Framework\Router\Exception\RouteNotFound => 'Die angeforderte Seite wurde nicht gefunden.',
            $e instanceof \App\Framework\Router\Exception\MethodNotAllowed => 'Diese Anfragemethode ist nicht erlaubt.',
            $e instanceof \App\Framework\Validation\Exceptions\ValidationException => 'Die eingegebenen Daten sind ungültig.',
            $e instanceof \App\Framework\Api\ApiException => 'Es ist ein Fehler bei der Kommunikation mit einem externen Dienst aufgetreten.',
            default => 'Es ist ein interner Fehler aufgetreten.',
        };
    }
}
