<?php

declare(strict_types=1);

$publicDir = __DIR__;
$requestPath = rawurldecode(parse_url($_SERVER['REQUEST_URI'] ?? '/', PHP_URL_PATH) ?: '/');
$requestedFile = realpath($publicDir . $requestPath);
if ($requestPath !== '/' && $requestedFile !== false && is_file($requestedFile) && str_starts_with($requestedFile, $publicDir . DIRECTORY_SEPARATOR)) {
    $mime = mime_content_type($requestedFile) ?: 'application/octet-stream';
    header('Content-Type: ' . $mime);
    header('Content-Length: ' . (string) filesize($requestedFile));
    readfile($requestedFile);
    exit;
}

use ThunderPanel\Controllers\ApiController;
use ThunderPanel\Controllers\AppPackageController;
use ThunderPanel\Controllers\AuthController;
use ThunderPanel\Controllers\BackupController;
use ThunderPanel\Controllers\DatabaseController;
use ThunderPanel\Controllers\DashboardController;
use ThunderPanel\Controllers\DomainController;
use ThunderPanel\Controllers\FileController;
use ThunderPanel\Controllers\FirewallController;
use ThunderPanel\Controllers\InternalNodeController;
use ThunderPanel\Controllers\JobController;
use ThunderPanel\Controllers\LogController;
use ThunderPanel\Controllers\MailAdminController;
use ThunderPanel\Controllers\MailController;
use ThunderPanel\Controllers\WebmailController;
use ThunderPanel\Controllers\MonitoringController;
use ThunderPanel\Controllers\PlanController;
use ThunderPanel\Controllers\PublicController;
use ThunderPanel\Controllers\ServerController;
use ThunderPanel\Controllers\SettingsController;
use ThunderPanel\Controllers\SubscriptionController;
use ThunderPanel\Controllers\TaskController;
use ThunderPanel\Controllers\UpdatesController;
use ThunderPanel\Controllers\UserController;
use ThunderPanel\Core\Router;

require dirname(__DIR__) . '/src/Core/bootstrap.php';

$router = new Router();

$router->get('/', [PublicController::class, 'home'], false);
$router->post('/register', [PublicController::class, 'register'], false);
$router->get('/login', [AuthController::class, 'showLogin'], false);
$router->post('/login', [AuthController::class, 'login'], false);
$router->post('/logout', [AuthController::class, 'logout'], true);

$router->post('/internal/node/heartbeat', [InternalNodeController::class, 'heartbeat'], false);
$router->post('/internal/node/authenticate', [InternalNodeController::class, 'authenticate'], false);

$router->get('/dashboard', [DashboardController::class, 'index'], true);

$router->get('/servers', [ServerController::class, 'index'], true);
$router->post('/servers/create', [ServerController::class, 'store'], true);
$router->post('/servers/check', [ServerController::class, 'check'], true);
$router->post('/servers/upload-node-package', [ServerController::class, 'uploadNodePackage'], true);
$router->post('/servers/deploy', [ServerController::class, 'deploy'], true);
$router->post('/servers/diagnose', [ServerController::class, 'diagnose'], true);
$router->post('/servers/issue-letsencrypt', [ServerController::class, 'issueLetsEncrypt'], true);
$router->post('/servers/update', [ServerController::class, 'update'], true);
$router->post('/servers/save-tamper-protection', [ServerController::class, 'saveTamperProtection'], true);
$router->post('/servers/queue-tamper-baseline', [ServerController::class, 'queueTamperBaseline'], true);
$router->post('/servers/queue-tamper-scan', [ServerController::class, 'queueTamperScan'], true);
$router->post('/servers/queue-tamper-restore', [ServerController::class, 'queueTamperRestore'], true);

$router->get('/apps', [AppPackageController::class, 'index'], true);
$router->post('/apps/create', [AppPackageController::class, 'store'], true);
$router->post('/apps/update', [AppPackageController::class, 'update'], true);
$router->post('/apps/delete', [AppPackageController::class, 'delete'], true);

$router->get('/plans', [PlanController::class, 'index'], true);
$router->post('/plans/create', [PlanController::class, 'store'], true);

$router->get('/subscriptions', [SubscriptionController::class, 'index'], true);
$router->post('/subscriptions/create', [SubscriptionController::class, 'store'], true);

$router->get('/domains', [DomainController::class, 'index'], true);
$router->post('/domains/create', [DomainController::class, 'store'], true);
$router->post('/domains/queue-provision', [DomainController::class, 'queueProvision'], true);
$router->post('/domains/queue-ssl', [DomainController::class, 'queueSsl'], true);
$router->post('/domains/generate-dns', [DomainController::class, 'generateDns'], true);

$router->get('/mail', [MailController::class, 'index'], true);
$router->get('/mail/admin', [MailAdminController::class, 'index'], true);
$router->post('/mail/admin/settings/save', [MailAdminController::class, 'saveSettings'], true);
$router->post('/mail/admin/keyword-rules/create', [MailAdminController::class, 'createKeywordRule'], true);
$router->post('/mail/admin/keyword-rules/delete', [MailAdminController::class, 'deleteKeywordRule'], true);
$router->post('/mail/admin/whitelist-rules/create', [MailAdminController::class, 'createWhitelistRule'], true);
$router->post('/mail/admin/whitelist-rules/delete', [MailAdminController::class, 'deleteWhitelistRule'], true);
$router->post('/mail/admin/sync-index', [MailAdminController::class, 'syncMailIndex'], true);
$router->post('/mail/admin/apply-stack', [MailAdminController::class, 'applyStack'], true);
$router->post('/mail/domains/create', [MailController::class, 'createMailDomain'], true);
$router->post('/mail/domains/update', [MailController::class, 'updateMailDomain'], true);
$router->post('/mail/domains/delete', [MailController::class, 'deleteMailDomain'], true);
$router->post('/mailboxes/create', [MailController::class, 'createMailbox'], true);
$router->post('/mailboxes/update', [MailController::class, 'updateMailbox'], true);
$router->post('/mailboxes/reset-password', [MailController::class, 'resetMailboxPassword'], true);
$router->post('/mailboxes/delete', [MailController::class, 'deleteMailbox'], true);
$router->post('/mailboxes/queue-provision', [MailController::class, 'queueMailboxProvision'], true);
$router->post('/mailboxes/filters/create', [MailController::class, 'createMailboxFilter'], true);
$router->post('/mailboxes/filters/delete', [MailController::class, 'deleteMailboxFilter'], true);
$router->post('/mail-aliases/create', [MailController::class, 'createAlias'], true);
$router->post('/mail-aliases/update', [MailController::class, 'updateAlias'], true);
$router->post('/mail-aliases/delete', [MailController::class, 'deleteAlias'], true);

$router->get('/webmail', [WebmailController::class, 'index'], false);
$router->post('/webmail/login', [WebmailController::class, 'login'], false);
$router->post('/webmail/logout', [WebmailController::class, 'logout'], false);
$router->post('/webmail/send', [WebmailController::class, 'send'], false);
$router->post('/webmail/move-message', [WebmailController::class, 'moveMessage'], false);
$router->post('/webmail/delete-message', [WebmailController::class, 'deleteMessage'], false);
$router->post('/webmail/filters/create', [WebmailController::class, 'createFilter'], false);
$router->post('/webmail/filters/delete', [WebmailController::class, 'deleteFilter'], false);

$router->get('/databases', [DatabaseController::class, 'index'], true);
$router->post('/databases/create', [DatabaseController::class, 'store'], true);
$router->post('/databases/queue-provision', [DatabaseController::class, 'queueProvision'], true);
$router->post('/databases/save-access', [DatabaseController::class, 'saveAccess'], true);

$router->get('/files', [FileController::class, 'index'], true);
$router->get('/firewall', [FirewallController::class, 'index'], true);
$router->post('/firewall/enable', [FirewallController::class, 'enable'], true);
$router->post('/firewall/disable', [FirewallController::class, 'disable'], true);
$router->post('/firewall/rules/create', [FirewallController::class, 'storeRule'], true);
$router->post('/firewall/rules/update', [FirewallController::class, 'updateRule'], true);
$router->post('/firewall/rules/delete', [FirewallController::class, 'deleteRule'], true);
$router->post('/firewall/bans/create', [FirewallController::class, 'banIp'], true);
$router->post('/firewall/bans/delete', [FirewallController::class, 'unbanIp'], true);
$router->post('/firewall/settings/save', [FirewallController::class, 'saveBruteforce'], true);
$router->get('/logs', [LogController::class, 'index'], true);
$router->get('/monitoring', [MonitoringController::class, 'index'], true);

$router->get('/tasks', [TaskController::class, 'index'], true);
$router->post('/tasks/create', [TaskController::class, 'store'], true);
$router->post('/tasks/queue-apply', [TaskController::class, 'queueApply'], true);

$router->get('/backups', [BackupController::class, 'index'], true);
$router->post('/backups/create', [BackupController::class, 'store'], true);
$router->post('/backups/queue-run', [BackupController::class, 'queueRun'], true);

$router->get('/jobs', [JobController::class, 'index'], true);
$router->post('/jobs/run-next', [JobController::class, 'runNext'], true);
$router->post('/jobs/run-batch', [JobController::class, 'runBatch'], true);

$router->get('/settings', [SettingsController::class, 'index'], true);
$router->post('/settings/save', [SettingsController::class, 'save'], true);
$router->post('/settings/main-site/apply', [SettingsController::class, 'queueApplyMainSite'], true);
$router->post('/settings/main-site/letsencrypt', [SettingsController::class, 'queueIssueLetsEncrypt'], true);

$router->get('/updates', [UpdatesController::class, 'index'], true);
$router->post('/updates/save', [UpdatesController::class, 'save'], true);
$router->post('/updates/check', [UpdatesController::class, 'check'], true);
$router->post('/updates/apply', [UpdatesController::class, 'apply'], true);

$router->get('/users', [UserController::class, 'index'], true);
$router->post('/users/create', [UserController::class, 'store'], true);
$router->post('/users/update', [UserController::class, 'update'], true);
$router->post('/users/delete', [UserController::class, 'delete'], true);
$router->post('/users/applications/approve', [UserController::class, 'approveApplication'], true);
$router->post('/users/applications/reject', [UserController::class, 'rejectApplication'], true);
$router->post('/users/groups/create', [UserController::class, 'createGroup'], true);
$router->post('/users/groups/update', [UserController::class, 'updateGroup'], true);
$router->post('/users/groups/delete', [UserController::class, 'deleteGroup'], true);

$router->get('/domains/manage', [DomainController::class, 'manage'], true);
$router->post('/domains/rename', [DomainController::class, 'rename'], true);
$router->post('/domains/remove', [DomainController::class, 'remove'], true);
$router->post('/domains/save-php-settings', [DomainController::class, 'savePhpSettings'], true);
$router->post('/domains/save-tls-settings', [DomainController::class, 'saveTlsSettings'], true);
$router->post('/domains/save-document-root', [DomainController::class, 'saveDocumentRoot'], true);
$router->post('/domains/save-rate-limit', [DomainController::class, 'saveRateLimit'], true);
$router->post('/domains/publish-builder', [DomainController::class, 'publishBuilder'], true);
$router->post('/domains/import-website', [DomainController::class, 'importWebsite'], true);
$router->post('/domains/save-protected-directory', [DomainController::class, 'saveProtectedDirectory'], true);
$router->post('/domains/save-live-chat', [DomainController::class, 'saveLiveChat'], true);
$router->post('/domains/reply-chat', [DomainController::class, 'replyChat'], true);
$router->post('/domains/save-tamper-protection', [DomainController::class, 'saveTamperProtection'], true);
$router->post('/domains/queue-tamper-baseline', [DomainController::class, 'queueTamperBaseline'], true);
$router->post('/domains/queue-tamper-scan', [DomainController::class, 'queueTamperScan'], true);
$router->post('/domains/queue-tamper-restore', [DomainController::class, 'queueTamperRestore'], true);

$router->get('/site-preview', [PublicController::class, 'sitePreview'], false);
$router->get('/live-chat/widget.js', [PublicController::class, 'widgetJs'], false);
$router->post('/live-chat/start', [PublicController::class, 'chatStart'], false);
$router->post('/live-chat/send', [PublicController::class, 'chatSend'], false);
$router->get('/live-chat/poll', [PublicController::class, 'chatPoll'], false);

$router->post('/api/files/list', [ApiController::class, 'fileList'], true);
$router->post('/api/files/read', [ApiController::class, 'fileRead'], true);
$router->post('/api/files/write', [ApiController::class, 'fileWrite'], true);
$router->post('/api/files/mkdir', [ApiController::class, 'fileMkdir'], true);
$router->post('/api/files/rename', [ApiController::class, 'fileRename'], true);
$router->post('/api/files/delete', [ApiController::class, 'fileDelete'], true);
$router->post('/api/files/delete-many', [ApiController::class, 'fileDeleteMany'], true);
$router->post('/api/files/upload', [ApiController::class, 'fileUpload'], true);
$router->post('/api/files/unzip', [ApiController::class, 'fileUnzip'], true);
$router->post('/api/logs/fetch', [ApiController::class, 'logsFetch'], true);
$router->post('/api/stats/fetch', [ApiController::class, 'statsFetch'], true);

$router->dispatch();
