<?php
declare(strict_types=1);

use Core\Util\Http;
use Core\App;
use Core\Log;
use Main\Model\Flash;

$timeInit = microtime(true);

try {
define('PATH_WEB', __DIR__);
    // boot application
    require '../boot.php';

    // init
    App::init();

    // update error handling
    ini_set('display_errors', (string)App::get('debug', DEBUG));
    if (App::get('debug', DEBUG)) {
        ini_set('html_errors', (string)true);
    }

    // under construction
    if (App::get('under_construction', false)) {
        if (in_array($_SERVER['REMOTE_ADDR'] ?? '', App::get('under_construction.exclude', []), true)) {
            Flash::warn('Der Wartungsmodus ist aktiv!');
        } else {
            include __DIR__ . '/construction.html';
            exit();
        }
    }

    App::handleRequest();

    // log site performance
    if (App::get('performance_log')) {
        \Main\Model\Performance::log(
            $_SERVER['REQUEST_METHOD'],
            $_SERVER['REQUEST_URI'],
            microtime(true) - $timeInit,
            memory_get_peak_usage()
        );
    }

} catch (Throwable $e) {
    if (!headers_sent() && class_exists(Http::class)) {
        \Core\Util\Http::setStatusCode(500);
    }

    if (!defined('HAS_EXCEPTION_HANDLER')) {
        echo 'Es trat ein Fehler auf!';
    }

    Log::exception('Fehler!', $e, [], true);


    if (App::get('debug', DEBUG)) {
        if (defined('HAS_EXCEPTION_HANDLER')) {
            throw $e;
        } else {
            printf(
                "<h2>[%d] %s</h2><h3>%s:%d</h3><pre>%s</pre>",
                $e->getCode(),
                $e->getMessage(),
                $e->getFile(),
                $e->getLine(),
                $e->getTraceAsString()
            );
            dump($e);
        }
    }
}

try {
    // shut down app
    App::shutdown();
} catch (Throwable $e) {
    if (!headers_sent() && class_exists(Http::class)) {
        \Core\Util\Http::setStatusCode(500);
    }

    if (!defined('HAS_EXCEPTION_HANDLER')) {
        echo 'Es trat ein Fehler auf!';
    }

    Log::exception('Fehler on shutdown! ' . $e->getMessage(), $e, [], true);


    if (App::get('debug', DEBUG)) {
        if (defined('HAS_EXCEPTION_HANDLER')) {
            throw $e;
        } else {
            printf(
                "<h2>[%d] %s</h2><h3>%s:%d</h3><pre>%s</pre>",
                $e->getCode(),
                $e->getMessage(),
                $e->getFile(),
                $e->getLine(),
                $e->getTraceAsString()
            );
            dump($e);
        }
    }
}


// debug bar
if (!empty(App::$debugger) && App::$debugger->getDebugBar() && App::get('debug', DEBUG) && App::get('debugy')) {
    $endTime = microtime(true);

    \Core\Debug\EventLogCollector::$startTime = $timeInit;
    \Core\Debug\EventLogCollector::$endTime = $endTime;


    // render
    if (App::$request->isAjax()) {
        App::$debugger->getDebugBar()->sendDataInHeaders(true);
    } else {
        $debugbarRenderer = App::$debugger->getDebugBar()->getJavascriptRenderer();
        $debugbarRenderer->addAssets([App::designPath('css/debugbar.css')], []);
        $debugbarRenderer->setEnableJqueryNoConflict(true);
        $debugbarRenderer->setBasePath('/vendor/php-debugbar/src/DebugBar/Resources');
        $debugbarRenderer->setBaseUrl('/vendor/php-debugbar/src/DebugBar/Resources');

        $debugbarRenderer->setOpenHandlerUrl('/main/debugbar/openhandler');

        echo $debugbarRenderer->renderHead();
        echo $debugbarRenderer->render();
    }
}
