<?php declare(strict_types=1);

namespace App\Engine\PageMeta;

final readonly class MetadataHandler
{

    public function __construct(
        private PageMeta                                                                         $pageMeta,
        private \Symfony\Component\Routing\RouterInterface                                       $router,
        protected \App\Engine\Admin\Inertia\SystemConfiguration\AdminSystemConfigurationProvider $adminSystemConfigurationProvider,
        protected \App\Engine\PageMeta\GeneralMetadata\GeneralMetadataSectionProvider            $generalMetadataSectionProvider,
        protected \Symfony\Component\DependencyInjection\ParameterBag\ParameterBagInterface      $parameterBag,
    ) {
    }

    public function handle(\Symfony\Component\HttpFoundation\Request $request): void
    {
        $route = $request->attributes->get("_route", "");
        $pageMetaViewModel = $this->pageMeta->getInstance();
        if ($route) {
            $canonical = $this->router->generate(
                name: $route,
                parameters: $request->attributes->get("_route_params", []),
                referenceType: \Symfony\Component\Routing\Generator\UrlGeneratorInterface::ABSOLUTE_URL,
            );
            $pageMetaViewModel->canonical = $canonical;
        }

        $this->handleGeneralMetadata($pageMetaViewModel, $request);
        match (true) {
            str_starts_with($route, \App\Engine\Routing\RouteCollectionPrefix::ADMIN) => $this->handleAdminMetadata($pageMetaViewModel),
            default => $this->handleFrontendMetadata($pageMetaViewModel),
        };
    }

    public function handlePage(\App\Engine\Page\Page $page): void
    {
        $pageMetaInstance = $this->pageMeta->getInstance();
        $pageMetaInstance->title = $page->getMetaTitle() ?: ($page->getTitle() ?: $pageMetaInstance->title);
        $pageMetaInstance->description = $page->getMetaDescription() ?: $pageMetaInstance->description;
        $pageMetaInstance->setShouldIndex($this->shouldIndex() && $page->getMetaShouldIndex());
    }

    public function handleUpcomingEvent(\App\Engine\UpcomingEvent\UpcomingEvent $upcomingEvent): void
    {
        $pageMetaInstance = $this->pageMeta->getInstance();
        $pageMetaInstance->title = $upcomingEvent->getTitle() ?: $pageMetaInstance->title;
        $pageMetaInstance->description = $upcomingEvent->getSummary() ?: $pageMetaInstance->description;
    }

    protected function handleGeneralMetadata(PageMetaViewModel $pageMetaViewModel, \Symfony\Component\HttpFoundation\Request $request): void
    {
        $pageMetaViewModel->author = "LifeCode.cz - Jozue KUPEC";
        $pageMetaViewModel->siteName = "Dětská misie";
        $pageMetaViewModel->schemeAndHost = $_ENV["CUSTOM_DOMAIN"] ?? $request->getSchemeAndHttpHost();
        $pageMetaViewModel->domain = $request->getHttpHost();
    }

    protected function handleAdminMetadata(PageMetaViewModel $pageMetaViewModel): void
    {
        $pageMetaViewModel->title = "Administrace";
        $pageMetaViewModel->description = "InteliFLEX - systém pro správu obsahu na webu";
        $pageMetaViewModel->keywords = "inteliflex, lifecode, cms, adminstration";
        $pageMetaViewModel->ogImage = $pageMetaViewModel->schemeAndHost . "/assets/images/admin/meta/ogimage.png";
        $pageMetaViewModel->setShouldIndex(false);
    }

    protected function handleFrontendMetadata(PageMetaViewModel $pageMetaViewModel): void
    {
        $metadata = $this->generalMetadataSectionProvider->provideCached();
        $pageMetaViewModel->title = $metadata->title;
        $pageMetaViewModel->ogImage = $pageMetaViewModel->schemeAndHost . $metadata->ogImage;
        $pageMetaViewModel->description = $metadata->description;
        $pageMetaViewModel->setShouldIndex($this->shouldIndex());
    }

    private function shouldIndex(): bool
    {
        return $this->parameterBag->get("frontend.index_follow") === "true";
    }

}