<?php

use \Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
use \Symfony\Component\HttpKernel\Exception\AccessDeniedHttpException;
use \Symfony\Component\HttpKernel\Exception\UnauthorizedHttpException;
use \Symfony\Component\HttpKernel\Exception\HttpException;
use \Symfony\Component\HttpFoundation\Response;
use \Symfony\Component\HttpFoundation\RedirectResponse;
use \Symfony\Component\HttpKernel\Exception\BadRequestHttpException;
use Systran\Exception\CustomException;
use Systran\Helper\TrackingRequest\Traits\ChangeTrackingRequest;
use \Xusifob\Router\Router;
use Systran\Helper\TrackingRequest\Traits\RevertAction;

$services = include __DIR__ . '/services.php';

/** @var Router $router */
$router = $services['router'];
$finallyError = false;
$error = false;
$descriptionMessage = '';
$errorStatus = 500;

try {
    $router->run($services);
} catch (NotFoundHttpException $e) {
    $finallyError = true;
    $error = true;

    $descriptionMessage = 'Sorry but the page you are looking for does not exist, have been removed. name changed or is temporarily unavailable';
    $errorStatus = Response::HTTP_NOT_FOUND;
} catch (UnauthorizedHttpException $e) {
    $finallyError = true;
    $redirect =  new RedirectResponse($router->generateUrl('app_login'));
    $redirect->send();
} catch (AccessDeniedHttpException $e) {
    $finallyError = true;
    $error = true;

    $descriptionMessage = $e->getMessage();
    $errorStatus = Response::HTTP_FORBIDDEN;
} catch (\Exception $e) {
    $finallyError = true;
    $error = true;

    $request = $router->getRequest();

    if (!($e instanceof BadRequestHttpException) && !($e instanceof CustomException)) {
        Sentry\captureException($e);
    }
    $accept = $request->headers->get('Accept', '');

    $accept = explode(',', $accept);

    $contentType = $request->headers->get('Content-Type');

    $message = $e->getMessage();

    if (strpos($accept[0], 'json') !== false || $contentType === "application/json") {
        $statusCode = $e instanceof CustomException && ($e->getCode() >= 100 && $e->getCode() < 600) ? $e->getCode() : 
                    ($e instanceof HttpException ? $e->getStatusCode() : null);
        $descriptionMessage = $message;
        $errorStatus = $statusCode ?? Response::HTTP_BAD_REQUEST;
        return;
    }

    $_SESSION['errors'][] = $message;

    if ($request->headers->get('referer')) {
        $error = false;
        $response = new RedirectResponse($request->headers->get('referer'));
        $response->send();
        return;
    }

    if ($e instanceof HttpException) {
        $descriptionMessage = $message;
        $errorStatus = $e->getStatusCode();
        return;
    }

    $descriptionMessage = $message;
    $errorStatus = Response::HTTP_BAD_REQUEST;
} finally {
    if ($finallyError) {
        $revertAction = $services[RevertAction::class];
        $trackingRequest = $services[ChangeTrackingRequest::class];
        $revertAction->revertActionInRequestError($trackingRequest->getDataTracking());
    }

    $descriptionMessage = $translator->getTranslation($descriptionMessage);
    if ($error && is_int(strpos($_SERVER['REQUEST_URI'], 'payment-link')) && $_SERVER['REQUEST_METHOD'] === 'GET') {
        setCookieError('description_message', $descriptionMessage);
        setCookieError('error_status', $errorStatus);
        $url = $router->generateUrl('app_error_page');
        header("Location: $url");
        exit();
    } else if ($error !== false) {
        $response = new Response($descriptionMessage, $errorStatus);
        $response->send();
    }
}
