<?php declare(strict_types=1);

namespace App\Controller;

class PageController extends \App\Engine\Inertia\Frontend\BaseInertiaFrontendController
{

    public function __construct(
        private readonly \App\Engine\PageMeta\MetadataHandler                $metadataHandler,
        \Rompetomp\InertiaBundle\Architecture\InertiaInterface               $inertia,
        \Symfony\Component\HttpFoundation\RequestStack                       $requestStack,
        \App\Engine\Inertia\Frontend\SystemConfigurationProvider             $systemConfigurationProvider,
        \App\Engine\Inertia\Frontend\GeneralContacts\GeneralContactsProvider $generalContactsProvider,
    ) {
        parent::__construct($inertia, $requestStack, $systemConfigurationProvider, $generalContactsProvider);
    }

    public function detail(
        \App\Engine\Page\PageRepository           $pageRepository,
        \Symfony\Component\HttpFoundation\Request $request,
    ): \Symfony\Component\HttpFoundation\Response {
        if (($url = $request->attributes->get("url")) === null) {
            throw $this->createNotFoundException();
        }

        $url = \App\Engine\Utills\StringHelpers::sanitizeUrlAsAbsoulutePath($url);
        $page = $pageRepository->findOneBy(["url" => $url, "enabled" => true]);
        if ($page === null) {
            throw $this->createNotFoundException();
        }

        return $this->createDetail($page);
    }

    public function detailSupportUs(
        \App\Engine\Page\PageRepository $pageRepository,
    ): \Symfony\Component\HttpFoundation\Response {
        $page = $pageRepository->findOneBy(["internalIdentifier" => \App\Engine\Page\PageDefinitions::SUPPORT_US_INTERNAL_IDENTIFIER]);
        if ($page === null) {
            throw $this->createNotFoundException();
        }

        return $this->createDetail($page);
    }

    public function getId(): string
    {
        return "Page";
    }

    private function createDetail(\App\Engine\Page\Page $page): \Symfony\Component\HttpFoundation\Response
    {
        $this->metadataHandler->handlePage($page);

        $props = new \App\Engine\Inertia\Frontend\Props\PageProps();
        $props->content = new \App\Engine\Inertia\Frontend\ViewModels\PageContentViewModel(
            title: $page->getTitle(),
            htmlContent: $page->getText(),
        );

        return $this->inertia->render(
            component: "{$this->getVueComponent()}/Detail",
            props: $this->getInertiaProps($props),
        );
    }

}
