<?php

namespace App\Exceptions;

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

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

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

        if (is_array($apiError)) {
            $this->apiMessage = $apiError;
        } else {
            $this->apiMessage = array(
                "error" => $apiError,
                "message" => Lang::get("response.{$apiError}"),
            );
        }

        $this->context = $context;

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

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

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

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

    public function getHeaders()
    {
        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());
    }
}
