<?php declare(strict_types=1);

namespace App\Engine\Inertia\Frontend;

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

final class SystemConfigurationProvider
{

    private ?SCV\ConfigurationViewModel $configuration = null;

    public function __construct(
        private readonly \App\Engine\Inertia\Providers\BrandInformationProvider         $brandInformationProvider,
        private readonly \App\Engine\PageMeta\PageMeta                                  $pageMeta,
        private readonly \App\Engine\Navigation\NavigationProvider                      $navigationProvider,
        private readonly \App\Engine\Literature\LiteratureProvider                      $literatureProvider,
        private readonly \App\Engine\VisitorsNotification\VisitorsNotificationsProvider $visitorsNotificationsProvider,
        private \Symfony\Component\HttpFoundation\RequestStack                          $requestStack,
    ) {
    }

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

        return $this->configuration;
    }

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

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

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

        $this->configuration->navigations = $this->createNavigations();

        $this->configuration->literature = $this->createLiterature();

        $this->configuration->visitorsNotifications = $this->createVisitorsNotifications();
    }

    private function createNavigations(): SCV\NavigationsViewModel
    {
        $navigations = new SCV\NavigationsViewModel();
        $navigations->headerMainNavigation = $this->navigationProvider->provideCached(section: \App\Engine\Navigation\NavigationSection::HeaderMain);
        $navigations->footerMainNavigation = $this->navigationProvider->provideCached(section: \App\Engine\Navigation\NavigationSection::FooterMain);

        return $navigations;
    }

    private function createLiterature(): SCV\LiteratureViewModel
    {
        $literature = new SCV\LiteratureViewModel();
        $literature->literature = $this->literatureProvider->provideCached();

        return $literature;
    }

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

        $visitorsNotifications = new SCV\VisitorsNotificationsViewModel();
        $visitorsNotifications->notifications = $this->visitorsNotificationsProvider->provideForLocationCached(
            $matchedRouteName === \App\Engine\Routing\RouteCollectionPrefix::FRONTEND_HOMEPAGE
                ? \App\Engine\VisitorsNotification\LocationEnum::Homepage
                : \App\Engine\VisitorsNotification\LocationEnum::Everywhere
        );

        return $visitorsNotifications;
    }

}
