<?php
declare(strict_types=1);

// Local dev server: let php -S serve real files under /assets directly.
if (PHP_SAPI === 'cli-server') {
    $file = __DIR__ . parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH);
    if (strpos((string) parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH), '/assets/') === 0 && is_file($file)) return false;
}

require dirname(__DIR__) . '/app/bootstrap.php';

Response::securityHeaders(config('secure_cookies'));

$request = null;
try {
    $request = Request::capture();
    Auth::attachUser($request);
    Auth::csrfProtection($request);
    Auth::enforcePasswordChange($request);
    Auth::enforceGuidelines($request);

    $router = new Router();
    $router->get('/', function (Request $request) {
        if (!$request->user) Response::redirect('/login');
        else Response::redirect($request->user['role'] === 'admin' ? '/admin' : '/jury/dashboard');
    });
    $router->get('/guidelines', fn (Request $request) => Response::html(guidelines_page($request->user, $request->session['csrf_token'] ?? '')));
    AuthController::register($router);
    JuryController::register($router);
    JuryApiController::register($router);
    AdminController::register($router);
    $router->dispatch($request);
} catch (RedirectException $redirect) {
    Response::redirect($redirect->location);
} catch (HttpException $error) {
    $api = $request && $request->wantsJson();
    $api ? Response::json(['error' => $error->getMessage()], $error->status) : Response::text($error->getMessage(), $error->status);
} catch (Throwable $error) {
    error_log((string) $error);
    $message = config('debug') ? 'Unexpected server error: ' . $error->getMessage() : 'Unexpected server error.';
    if (!headers_sent()) {
        $request && str_starts_with($request->path, '/api/') ? Response::json(['error' => $message], 500) : Response::text($message, 500);
    }
}
