<?php declare(strict_types=1);

use App\Engine\Routing as ER;

return function (\Symfony\Component\Routing\Loader\Configurator\RoutingConfigurator $routes): void {
    //<editor-fold desc="API">
    //<editor-fold desc="API V1">
    $apiGroup = $routes->collection(ER\RouteCollectionPrefix::API);
    $apiGroup->prefix("/api");
    $apiGroupV1 = $apiGroup->collection(ER\RouteCollectionPrefix::API_V1);
    $apiGroupV1->prefix("/v1");

    //<editor-fold desc="FileManager (JODIT)">
    $route = $apiGroupV1->add("FileManager", "/file-manager");
    $route->methods(["GET", "POST"]);
    $route->controller([\App\Engine\Files\Jodit\FileManagerController::class, "index"]);
    //</editor-fold>
    //</editor-fold>

    //<editor-fold desc="API V2">
    $apiGroupV2 = $apiGroup->collection(ER\RouteCollectionPrefix::API_V2);
    $apiGroupV2->prefix("/v2");

    //<editor-fold desc="FileManager (FLMNGR)">
    $route = $apiGroupV2->add("FileManager", "/file-manager");
    $route->methods(["GET", "POST"]);
    $route->controller([\App\Engine\Admin\Storage\FileManagerController::class, "flmngrApi"]);
    //</editor-fold>
    //</editor-fold>

    //<editor-fold desc="API V3">
    $apiGroupV3 = $apiGroup->collection(ER\RouteCollectionPrefix::API_V3);
    $apiGroupV3->prefix("/v3");

    //<editor-fold desc="FileManager (FilesJS)">
    $fileManagerGroup = $apiGroupV3->collection('FileManager');
    $fileManagerGroup->prefix('/file-manager');

    $route = $fileManagerGroup->add('ListFiles', '/list-files');
    $route->methods(["GET", "POST"]);
    $route->controller([\App\Engine\Files\FilesJs\Controllers\ListFilesController::class, "index"]);

    $route = $fileManagerGroup->add('ListFolders', '/list-folders');
    $route->methods(["GET", "POST"]);
    $route->controller([\App\Engine\Files\FilesJs\Controllers\ListFoldersController::class, "index"]);

    $route = $fileManagerGroup->add('DeleteFiles', '/delete-files');
    $route->methods(["POST"]);
    $route->controller([\App\Engine\Files\FilesJs\Controllers\DeleteFilesController::class, "index"]);

    $route = $fileManagerGroup->add('UploadFiles', '/upload-files');
    $route->methods(["POST"]);
    $route->controller([\App\Engine\Files\FilesJs\Controllers\UploadFilesController::class, "index"]);

    $route = $fileManagerGroup->add('MoveFiles', '/move-files');
    $route->methods(["POST"]);
    $route->controller([\App\Engine\Files\FilesJs\Controllers\MoveFilesController::class, "index"]);

    $route = $fileManagerGroup->add('CreateFolder', '/create-folder');
    $route->methods(["POST"]);
    $route->controller([\App\Engine\Files\FilesJs\Controllers\CreateFolderController::class, "index"]);

    $route = $fileManagerGroup->add('RenameFile', '/rename-file');
    $route->methods(["POST"]);
    $route->controller([\App\Engine\Files\FilesJs\Controllers\RenameFileController::class, "index"]);

    $route = $fileManagerGroup->add('SaveText', '/save-text');
    $route->methods(["POST"]);
    $route->controller([\App\Engine\Files\FilesJs\Controllers\SaveTextController::class, "index"]);

    $route = $fileManagerGroup->add('ViewFile', '/view-file');
    $route->methods(["POST"]);
    $route->controller([\App\Engine\Files\FilesJs\Controllers\ViewFileController::class, "index"]);
    //</editor-fold>
    //</editor-fold>

    //<editor-fold desc="Test group for debug purposes only">
    $testGroup = $routes->collection(ER\RouteCollectionPrefix::Test);
    $testGroup->prefix("/test");

    $route = $testGroup->add("Index", "/");
    $route->methods(["GET"]);
    $route->controller([\App\Controller\TestController::class, "index"]);

    $route = $testGroup->add("Vue", "/vue");
    $route->methods(["GET", "POST", "DELETE"]);
    $route->controller([\App\Controller\TestController::class, "vue"]);
    //</editor-fold>

    //<editor-fold desc="Admin">
    //<editor-fold desc="Admin base routes">
    $adminGroup = $routes->collection(ER\RouteCollectionPrefix::ADMIN);
    $adminGroup->prefix("/admin");

    $route = $adminGroup->add("Login", "/login");
    $route->methods(["GET", "POST"]);
    $route->controller([\App\Engine\Admin\Auth\LoginController::class, "index"]);

    $route = $adminGroup->add("Logout", "/logout");
    $route->methods(["GET"]);
    $route->controller([\App\Engine\Admin\Auth\LogoutController::class, "index"]);

    $route = $adminGroup->add("Dashboard", "/");
    $route->methods(["GET", "POST"]);
    $route->controller([\App\Engine\Admin\Dashboard\DashboardController::class, "index"]);

    $route = $adminGroup->add("CacheClear", "/clear-cache");
    $route->methods(["GET"]);
    $route->controller([\App\Engine\Cache\CacheInvalidatorController::class, "clearAll"]);

    $route = $adminGroup->add("FileManager", "/file-manager");
    $route->methods(["GET"]);
    $route->controller([\App\Engine\Admin\Storage\FileManagerController::class, "index"]);

    $route = $adminGroup->add("FileManagerStandAlone", "/file-manager-stand-alone");
    $route->methods(["GET"]);
    $route->controller([\App\Engine\Admin\Storage\FileManagerController::class, "standAlone"]);

    $route = $adminGroup->add("FileManagerStandAlonePicker", "/file-manager-stand-alone-picker");
    $route->methods(["GET"]);
    $route->controller([\App\Engine\Admin\Storage\FileManagerController::class, "standAlonePicker"]);
    //</editor-fold>

    //<editor-fold desc="Admin user">
    $adminUser = $adminGroup->collection(ER\RouteCollectionPrefix::ADMIN_ADMINISTRATOR_USER);
    $adminUser->prefix("/admin-user");

    $route = $adminUser->add("List", "/list");
    $route->methods(["GET"]);
    $route->controller([\App\Engine\AdministratorUser\AdministratorUserController::class, "list"]);

    $route = $adminUser->add("Edit", "/edit/{id}");
    $route->methods(["GET", "POST"]);
    $route->controller([\App\Engine\AdministratorUser\AdministratorUserController::class, "edit"]);

    $route = $adminUser->add("New", "/new");
    $route->methods(["GET", "POST"]);
    $route->controller([\App\Engine\AdministratorUser\AdministratorUserController::class, "new"]);

    $route = $adminUser->add("Delete", "/delete");
    $route->methods(["GET"]);
    $route->controller([\App\Engine\AdministratorUser\AdministratorUserController::class, "delete"]);

    $route = $adminUser->add("Profile", "/profile");
    $route->methods(["GET"]);
    $route->controller([\App\Engine\AdministratorUser\AdministratorUserController::class, "profile"]);

    $route = $adminUser->add("AccessMethods", "/accessMethods/{id}");
    $route->methods(["GET", "POST"]);
    $route->controller([\App\Engine\AdministratorUser\AdministratorUserController::class, "accessMethods"]);

    $route = $adminUser->add("DeleteStoredPasskey", "/deleteStoredPasskey/{id}");
    $route->methods(["GET"]);
    $route->defaults([
        "credentialId" => null,
    ]);
    $route->controller([\App\Engine\AdministratorUser\AdministratorUserController::class, "deleteStoredPasskey"]);
    //</editor-fold>

    //<editor-fold desc="Page">
    $adminPage = $adminGroup->collection(ER\RouteCollectionPrefix::ADMIN_PAGE);
    $adminPage->prefix("/page");

    $route = $adminPage->add("List", "/list");
    $route->methods(["GET"]);
    $route->controller([\App\Engine\Page\PageController::class, "list"]);

    $route = $adminPage->add("Edit", "/edit/{id}");
    $route->methods(["GET", "POST"]);
    $route->controller([\App\Engine\Page\PageController::class, "edit"]);

    $route = $adminPage->add("New", "/new");
    $route->methods(["GET", "POST"]);
    $route->controller([\App\Engine\Page\PageController::class, "new"]);

    $route = $adminPage->add("Delete", "/delete");
    $route->methods(["GET"]);
    $route->controller([\App\Engine\Page\PageController::class, "delete"]);
    //</editor-fold>

    //<editor-fold desc="Navigation">
    $adminPage = $adminGroup->collection(ER\RouteCollectionPrefix::ADMIN_NAVIGATION);
    $adminPage->prefix("/navigation");

    $route = $adminPage->add("List", "/list/{parentId?}");
    $route->requirements(["parentId" => "\d+"]);
    $route->methods(["GET"]);
    $route->controller([\App\Engine\Navigation\NavigationController::class, "list"]);

    $route = $adminPage->add("Edit", "/edit/{id}");
    $route->methods(["GET", "POST"]);
    $route->controller([\App\Engine\Navigation\NavigationController::class, "edit"]);

    $route = $adminPage->add("New", "/new/{parentId?}");
    $route->requirements(["parentId" => "\d+"]);
    $route->methods(["GET", "POST"]);
    $route->controller([\App\Engine\Navigation\NavigationController::class, "new"]);

    $route = $adminPage->add("Delete", "/delete/{id}");
    $route->methods(["GET"]);
    $route->controller([\App\Engine\Navigation\NavigationController::class, "delete"]);
    //</editor-fold>

    //<editor-fold desc="Literature">
    $adminLiterature = $adminGroup->collection(ER\RouteCollectionPrefix::ADMIN_LITERATURE);
    $adminLiterature->prefix("/literature");

    $route = $adminLiterature->add("List", "/list");
    $route->methods(["GET"]);
    $route->controller([\App\Engine\Literature\LiteratureController::class, "list"]);

    $route = $adminLiterature->add("Edit", "/edit/{id}");
    $route->methods(["GET", "POST"]);
    $route->controller([\App\Engine\Literature\LiteratureController::class, "edit"]);

    $route = $adminLiterature->add("New", "/new/{parentId?}");
    $route->requirements(["parentId" => "\d+"]);
    $route->methods(["GET", "POST"]);
    $route->controller([\App\Engine\Literature\LiteratureController::class, "new"]);

    $route = $adminLiterature->add("Delete", "/delete/{id}");
    $route->methods(["GET"]);
    $route->controller([\App\Engine\Literature\LiteratureController::class, "delete"]);
    //</editor-fold>

    //<editor-fold desc="UpcomingEvent">
    $adminUpcomingEvent = $adminGroup->collection(ER\RouteCollectionPrefix::ADMIN_UPCOMING_EVENT);
    $adminUpcomingEvent->prefix("/upcomingEvent");

    $route = $adminUpcomingEvent->add("List", "/list");
    $route->methods(["GET"]);
    $route->controller([\App\Engine\UpcomingEvent\UpcomingEventController::class, "list"]);

    $route = $adminUpcomingEvent->add("Edit", "/edit/{id}");
    $route->methods(["GET", "POST"]);
    $route->controller([\App\Engine\UpcomingEvent\UpcomingEventController::class, "edit"]);

    $route = $adminUpcomingEvent->add("New", "/new/{parentId?}");
    $route->requirements(["parentId" => "\d+"]);
    $route->methods(["GET", "POST"]);
    $route->controller([\App\Engine\UpcomingEvent\UpcomingEventController::class, "new"]);

    $route = $adminUpcomingEvent->add("Delete", "/delete/{id}");
    $route->methods(["GET"]);
    $route->controller([\App\Engine\UpcomingEvent\UpcomingEventController::class, "delete"]);
    //</editor-fold>

    //<editor-fold desc="VisitorNotificaton">
    $adminVisitorsNotifications = $adminGroup->collection(ER\RouteCollectionPrefix::ADMIN_VISITOR_NOTIFICATON);
    $adminVisitorsNotifications->prefix("/visitorsNotificaton");

    $route = $adminVisitorsNotifications->add("List", "/list");
    $route->methods(["GET"]);
    $route->controller([\App\Engine\VisitorsNotification\VisitorsNotificationController::class, "list"]);

    $route = $adminVisitorsNotifications->add("Edit", "/edit/{id}");
    $route->methods(["GET", "POST"]);
    $route->controller([\App\Engine\VisitorsNotification\VisitorsNotificationController::class, "edit"]);

    $route = $adminVisitorsNotifications->add("New", "/new/{parentId?}");
    $route->requirements(["parentId" => "\d+"]);
    $route->methods(["GET", "POST"]);
    $route->controller([\App\Engine\VisitorsNotification\VisitorsNotificationController::class, "new"]);

    $route = $adminVisitorsNotifications->add("Delete", "/delete/{id}");
    $route->methods(["GET"]);
    $route->controller([\App\Engine\VisitorsNotification\VisitorsNotificationController::class, "delete"]);
    //</editor-fold>

    //<editor-fold desc="Settings">
    $adminSettings = $adminGroup->collection(ER\RouteCollectionPrefix::ADMIN_SETTINGS);
    $adminSettings->prefix("/settings");

    $route = $adminSettings->add("Index", "/");
    $route->methods(["GET", "POST"]);
    $route->controller([\App\Engine\Settings\SettingsController::class, "index"]);
    //</editor-fold>
    //</editor-fold>

    //<editor-fold desc="Frontend">
    $route = $routes->add(ER\RouteCollectionPrefix::FRONTEND_HOMEPAGE, "/");
    $route->methods(["GET"]);
    $route->controller([\App\Controller\HomepageController::class, "index"]);
    $route->options(['sitemap' => true]);

    //<editor-fold desc="UpcomingEvent">
    $frontendUpcomingEvent = $routes->collection(ER\RouteCollectionPrefix::FRONTEND_UPCOMING_EVENT);
    $frontendUpcomingEvent->prefix(\App\Engine\Localization\TranslatorStaticProxy::getInstance()->trans("fe.upcoming-event.detail-url"));

    $route = $frontendUpcomingEvent->add("List", "/");
    $route->methods(["GET"]);
    $route->controller([\App\Controller\UpcomingEventController::class, "list"]);
    $route->options(['sitemap' => ['priority' => 0.7]]);

    $route = $frontendUpcomingEvent->add("TrainingList", "/vzdelavani");
    $route->methods(["GET"]);
    $route->controller([\App\Controller\UpcomingEventController::class, "trainingList"]);
    $route->options(['sitemap' => ['priority' => 0.7]]);

    $route = $frontendUpcomingEvent->add("Detail", "{urlPart}");
    $route->methods(["GET"]);
    $route->controller([\App\Controller\UpcomingEventController::class, "detail"]);
    //</editor-fold>

    //<editor-fold desc="Page">
    $frontendPage = $routes->collection(ER\RouteCollectionPrefix::FRONTEND_PAGE);
    $route = $frontendPage->add("DetailSupportUs", "/podporte-nas");
    $route->methods(["GET"]);
    $route->controller([\App\Controller\PageController::class, "detailSupportUs"]);
    $route->options(['sitemap' => ['priority' => 0.7]]);

    $route = $frontendPage->add("Detail", "{url}");
    $route->methods(["GET"]);
    $route->controller([\App\Controller\PageController::class, "detail"]);
    //</editor-fold>
    //</editor-fold>

    $route = $routes->add('RobotsTxt', "/robots.txt");
    $route->methods(['GET']);
    $route->controller([\App\Controller\RobotsTxtController::class, "index"]);
};
