<?php

namespace App\Exceptions;

use Illuminate\Contracts\Support\Responsable;
use Illuminate\Http\JsonResponse;
use Illuminate\Support\Facades\App;
use Symfony\Component\HttpKernel\Exception\HttpExceptionInterface;
use Throwable;
use RuntimeException;

class ApiHttpException extends RuntimeException implements HttpExceptionInterface, Responsable
{
    private $apiMessage;
    private $context;
    private $statusCode;
    private $headers;

    public function __construct($statusCode, $apiError, array $context = [], array $headers = [], Throwable $previous = null, $code = 0)
    {
        $this->statusCode = $statusCode;
        $this->headers = $headers;
        $this->context = $context;

        if (is_array($apiError)) {
            $this->apiMessage = $apiError;
        } else {
            // Try to get locale from URL segment (e.g., /api/v1/en/...)
            $locale = request()->segment(3) ?? App::getLocale();

            // Validate locale exists, otherwise use default
            $supportedLocales = ['en', 'de', 'fr', 'it'];
            if (!in_array($locale, $supportedLocales)) {
                $locale = 'en';
            }

            // Set locale temporarily for translation
            App::setLocale($locale);

            // Use trans() helper for proper locale detection
            $translatedMessage = trans("response.{$apiError}", $context);

            // If translation key doesn't exist, trans() returns the key itself
            // In that case, use the original error as message
            if ($translatedMessage === "response.{$apiError}") {
                $translatedMessage = $apiError;
            }

            $this->apiMessage = array(
                "error" => $apiError,
                "message" => $translatedMessage,
            );

            // Include context data in the response for dynamic information
            if (!empty($context)) {
                $this->apiMessage["context"] = $context;
            }
        }

        parent::__construct($this->apiMessage["message"], $code, $previous);
    }

    public function getApiMessage()
    {
        return $this->apiMessage;
    }

    public function getContext()
    {
        return $this->context;
    }

    public function getStatusCode(): int
    {
        return $this->statusCode;
    }

    public function getHeaders(): array
    {
        return $this->headers;
    }


    /**
     * Create an HTTP response that represents the object.
     *
     * @param  \Illuminate\Http\Request $request
     * @return JsonResponse
     */
    public function toResponse($request): JsonResponse
    {
        return response()->json($this->getApiMessage(), $this->getStatusCode());
    }
}
