<?php

declare(strict_types=1);

use Dotenv\Dotenv;

date_default_timezone_set('Asia/Tashkent');

if (!empty($_SERVER['HTTP_X_FORWARDED_FOR'])) {
    $_SERVER['CLIENT_IP'] = $_SERVER['HTTP_X_FORWARDED_FOR'];
} elseif (!empty($_SERVER['HTTP_CLIENT_IP'])) {
    $_SERVER['CLIENT_IP'] = $_SERVER['HTTP_CLIENT_IP'];
}

if (isset($_SERVER['HTTP_ORIGIN']) && $_SERVER['HTTP_ORIGIN']) {
    header("Access-Control-Allow-Origin: {$_SERVER['HTTP_ORIGIN']}");
    header('Access-Control-Allow-Credentials: true');
    header('Access-Control-Max-Age: 86400');
}

if ($_SERVER['REQUEST_METHOD'] === 'OPTIONS') {
    if (isset($_SERVER['HTTP_ACCESS_CONTROL_REQUEST_METHOD']))
        header("Access-Control-Allow-Methods: GET, POST, PUT, DELETE, OPTIONS, PATCH");

    if (isset($_SERVER['HTTP_ACCESS_CONTROL_REQUEST_HEADERS']))
        header("Access-Control-Allow-Headers: {$_SERVER['HTTP_ACCESS_CONTROL_REQUEST_HEADERS']}");

    exit(0);
}

if (isset($_SERVER["CONTENT_LENGTH"]) && $_SERVER["CONTENT_LENGTH"]) {
    $allowed_request_length = ((int) ini_get('post_max_size') * 1024 * 1024);

    if ($_SERVER["CONTENT_LENGTH"] > $allowed_request_length) {
        ob_get_contents();
        if (ob_get_level() > 0) {
            ob_end_clean();
        }
        http_response_code(413);
        header('Content-Type: application/json; charset=UTF-8');

        $response = new stdClass();
        $response->code = 413;
        $response->message = 'Запрос слишком велик';

        echo json_encode($response);
        exit;
    }
}


try {
    require_once('../App/Config/Core.php');
    require_once('../vendor/autoload.php');

    if(isDevelopment()){
        error_reporting(E_ALL);
        ini_set('display_errors', 1);
    } else {
        error_reporting(E_ALL);
        ini_set('display_errors', 0);
    }

    set_error_handler('appErrorHandler');
    set_exception_handler('appExceptionHandler');
    register_shutdown_function('appShutdownHandler');

    $dotenv = Dotenv::createImmutable(__DIR__ . '/../');
    $dotenv->load();

    $app = \App\Core\Engine\Application::create();
    $app->start();

} catch (Exception $e) {
    ob_get_contents();
    if (ob_get_level() > 0) {
        ob_end_clean();
    }

    sendJsonResponse(503, 'Something went wrong', [
        'exception' => $e->getMessage(),
        'file' => $e->getFile(),
        'line' => $e->getLine(),
        'trace' => $e->getTraceAsString()
    ]);

    exit;
}