<?php

declare(strict_types=1);

require __DIR__ . '/src/bootstrap.php';

use App\AdminController;
use App\AuthController;
use App\MailController;
use App\Router;
use App\TokenController;

set_exception_handler(static function (Throwable $e): void {
    error_log(get_class($e) . ': ' . $e->getMessage() . ' in ' . $e->getFile() . ':' . $e->getLine());
    if (!headers_sent()) {
        http_response_code(500);
        header('Content-Type: text/plain; charset=utf-8');
    }
    echo 'Внутренняя ошибка. Подробности в журнале сервера.';
});

$token = '(?P<token>[A-Za-z0-9_-]{43})';

$router = new Router();
$router->add('GET', '/login', [AuthController::class, 'form']);
$router->add('POST', '/login', [AuthController::class, 'login']);
$router->add('POST', '/logout', [AuthController::class, 'logout']);

$router->add('GET', '/', [MailController::class, 'inbox']);
$router->add('GET', '/inbox', [MailController::class, 'inbox']);
$router->add('POST', '/sync', [MailController::class, 'sync']);
$router->add('GET', '/message/(?P<id>\d+)', [MailController::class, 'show']);
$router->add('GET', '/message/(?P<id>\d+)/html', [MailController::class, 'frame']);
$router->add('GET', '/attachment/(?P<id>\d+)', [MailController::class, 'attachment']);
$router->add('GET', '/compose', [MailController::class, 'compose']);
$router->add('POST', '/compose', [MailController::class, 'send']);
$router->add('GET', '/reply/(?P<id>\d+)', [MailController::class, 'reply']);

$router->add('GET', '/admin/users', [AdminController::class, 'users']);
$router->add('POST', '/admin/users', [AdminController::class, 'createUser']);
$router->add('POST', '/admin/users/(?P<id>\d+)/toggle', [AdminController::class, 'toggleUser']);
$router->add('POST', '/admin/users/(?P<id>\d+)/password', [AdminController::class, 'resetPassword']);
$router->add('GET', '/admin/mailboxes', [AdminController::class, 'mailboxes']);
$router->add('POST', '/admin/mailboxes', [AdminController::class, 'createMailbox']);
$router->add('GET', '/admin/domains', [AdminController::class, 'domains']);
$router->add('POST', '/admin/domains/sync', [AdminController::class, 'syncDomains']);
$router->add('GET', '/admin/tokens', [AdminController::class, 'tokens']);
$router->add('POST', '/admin/tokens', [AdminController::class, 'createToken']);
$router->add('POST', '/admin/tokens/(?P<id>\d+)/revoke', [AdminController::class, 'revokeToken']);

$router->add('GET', "/t/$token", [TokenController::class, 'inbox']);
$router->add('GET', "/t/$token/m/(?P<id>\d+)", [TokenController::class, 'show']);
$router->add('GET', "/t/$token/m/(?P<id>\d+)/html", [TokenController::class, 'frame']);

$path = parse_url($_SERVER['REQUEST_URI'] ?? '/', PHP_URL_PATH) ?: '/';
$router->dispatch($_SERVER['REQUEST_METHOD'] ?? 'GET', $path === '/' ? '/' : rtrim($path, '/'));
