<?php declare(strict_types=1);

namespace App\Engine\Admin\Inertia\SystemConfiguration;

use App\Engine\Admin\Inertia\SystemConfiguration\ViewModels as SCV;

final class AdminSystemConfigurationProvider
{

    private ?SCV\ConfigurationViewModel $configuration = null;

    public function __construct(
        private readonly \Symfony\Contracts\Translation\TranslatorInterface        $translator,
        private readonly \Symfony\Component\Routing\RouterInterface                $router,
        private readonly \Symfony\Component\HttpFoundation\RequestStack            $requestStack,
        private readonly \App\Engine\AdministratorUser\AdministratorUserRepository $administratorUserRepository,
        private readonly \Symfony\Bundle\SecurityBundle\Security                   $security,
        private readonly \App\Engine\Inertia\Providers\BrandInformationProvider    $brandInformationProvider,
        private readonly \App\Engine\PageMeta\PageMeta                             $pageMeta,
    ) {
    }

    public function getConfiguration(): SCV\ConfigurationViewModel
    {
        if (!$this->configuration) {
            $this->initialize();
        }

        return $this->configuration;
    }

    private function initialize(): void
    {
        $this->configuration = new SCV\ConfigurationViewModel();

        $this->configuration->banner = new SCV\BannerViewModel();
        $this->configuration->banner->title = $this->translator->trans("admin.banner.title");
        $this->configuration->banner->text = $this->translator->trans("admin.banner.text");

        $this->configuration->banner->button = new SCV\ButtonViewModel();
        $this->configuration->banner->button->name = $this->translator->trans("admin.banner.button.text");
        $this->configuration->banner->button->link = $this->translator->trans("site.author.url");

        $this->configuration->brandInformation = $this->brandInformationProvider->provideCached();

        $this->configuration->user = $this->createUserByLoggedInUser();

        $this->configuration->pageMeta = $this->pageMeta->getInstance();

        $this->configuration->sidebarNavigation = $this->createSidebarNavigation();
    }

    private function createUserByLoggedInUser(): SCV\UserViewModel
    {
        $user = new SCV\UserViewModel();
        $administratorUser = $this->administratorUserRepository->findOneBy(["email" => $this->security->getUser()?->getUserIdentifier()]);
        if (!$administratorUser) {
            return $user;
        }

        $user->wholeName = sprintf("%s, %s", $administratorUser->getFirstName(), $administratorUser->getLastName());
        $user->firstName = $administratorUser->getFirstName();
        $user->lastName = $administratorUser->getLastName();
        $user->roleName = in_array(\App\Engine\Security\Role::SUPER_ADMINISTRATOR, $administratorUser->getRoles()) ? "Administrator" : "Správce";
        $user->profileImage = "/assets/images/admin/user/customer-service_640.png";
        $user->contactAddress = $administratorUser->getContactAddress();
        $user->employer = $administratorUser->getEmployer();
        $user->jobPosition = $administratorUser->getJobPosition();
        $user->socialsWebsite = $administratorUser->getSocialsWebsite();
        $user->socialsPlatformX = $administratorUser->getSocialsPlatformX();
        $user->socialsFacebook = $administratorUser->getSocialsFacebook();
        $user->socialsInstagram = $administratorUser->getSocialsInstagram();
        $user->socialsLinkedIn = $administratorUser->getSocialsLinkedIn();
        return $user;
    }

    private function createSidebarNavigation(): SCV\SidebarNavigationViewModel
    {
        $request = $this->requestStack->getCurrentRequest();
        $matchedRouteName = $request->attributes->get('_route');

        $system = new SCV\Navigation\NavigationTree(name: $this->translator->trans("admin.menu.system"), items: [
            new SCV\Navigation\NavigationItem(
                id: "adminUser",
                name: $this->translator->trans("admin.menu.adminUsers"),
                link: $this->router->generate("AdminAdministratorUserList"),
                icon: "user",
                isActive: str_starts_with($matchedRouteName, "AdminAdministratorUser"),
            ),
            new SCV\Navigation\NavigationItem(
                id: "fileManager",
                name: $this->translator->trans("admin.menu.fileManager"),
                link: $this->router->generate("AdminFileManager"),
                icon: "folder",
                isActive: str_starts_with($matchedRouteName, "AdminFileManager"),
            ),
            new SCV\Navigation\NavigationItem(
                id: "settings",
                name: $this->translator->trans("admin.menu.settings"),
                link: $this->router->generate("AdminSettingsIndex"),
                icon: "sliders",
                isActive: str_starts_with($matchedRouteName, "AdminSettings"),
            ),
        ]);
        $cms = new SCV\Navigation\NavigationTree(name: $this->translator->trans("admin.menu.cms"), items: [
            new SCV\Navigation\NavigationItem(
                id: "dashboard",
                name: $this->translator->trans("admin.menu.dashboard"),
                link: $this->router->generate("AdminDashboard"),
                icon: "sliders",
                isActive: $matchedRouteName === "AdminDashboard",
            ),
            new SCV\Navigation\NavigationItem(
                id: "page",
                name: $this->translator->trans("admin.menu.page"),
                link: $this->router->generate("AdminPageList"),
                icon: "file",
                isActive: str_starts_with($matchedRouteName, "AdminPage"),
            ),
            new SCV\Navigation\NavigationItem(
                id: "page",
                name: $this->translator->trans("admin.menu.navigation"),
                link: $this->router->generate("AdminNavigationList"),
                icon: "menu",
                isActive: str_starts_with($matchedRouteName, "AdminNavigation"),
            ),
            new SCV\Navigation\NavigationItem(
                id: "upcomingEvent",
                name: $this->translator->trans("admin.menu.upcoming-event"),
                link: $this->router->generate("AdminUpcomingEventList"),
                icon: "calendar",
                isActive: str_starts_with($matchedRouteName, "AdminUpcomingEvent"),
            ),
            new SCV\Navigation\NavigationItem(
                id: "literature",
                name: $this->translator->trans("admin.menu.literature"),
                link: $this->router->generate("AdminLiteratureList"),
                icon: "book",
                isActive: str_starts_with($matchedRouteName, "AdminLiterature"),
            ),
            new SCV\Navigation\NavigationItem(
                id: "visitorsNotification",
                name: $this->translator->trans("admin.menu.visitors-notification"),
                link: $this->router->generate("AdminVisitorsNotificationList"),
                icon: "info",
                isActive: str_starts_with($matchedRouteName, "AdminVisitorsNotification"),
            ),
        ]);

        $this->processCollapses($result = new SCV\SidebarNavigationViewModel(navigations: [
            $system,
            $cms,
        ]));
        return $result;
    }

    private function processCollapses(SCV\SidebarNavigationViewModel $sidebarNavigationViewModel): void
    {
        foreach ($sidebarNavigationViewModel->navigations as $navigation) {
            foreach ($navigation->items as $item) {
                $this->processItemCollapses($item);
            }
        }
    }

    private function processItemCollapses(SCV\Navigation\NavigationItem $navigationItem): void
    {
        foreach ($navigationItem->items as $item) {
            $this->processItemCollapses($item);
            $navigationItem->isCollapsed = $navigationItem->isCollapsed || $item->isActive || $item->isCollapsed;
            $navigationItem->isActive = $navigationItem->isCollapsed || $item->isActive || $item->isCollapsed;
        }
    }

}
