<?php
declare(strict_types=1);

namespace Autogedal\Manufacturers\Controller\Index;

use Autogedal\Manufacturers\Api\ManufacturerPageRepositoryInterface;
use Autogedal\Manufacturers\Controller\AbstractManufacturerPage;
use Autogedal\Manufacturers\Model\Config;
use Autogedal\Manufacturers\Model\ManufacturerUrl;
use Autogedal\Manufacturers\Service\SlugHandler;
use Magento\Cms\Api\Data\PageInterface;
use Magento\Cms\Api\GetPageByIdentifierInterface;
use Magento\Framework\App\Action\Context;
use Magento\Framework\Controller\ResultFactory;
use Magento\Framework\Controller\ResultInterface;
use Magento\Framework\Exception\NoSuchEntityException;
use Magento\Store\Model\StoreManagerInterface;

class View extends AbstractManufacturerPage
{
    public function __construct(
        Context $context,
        Config $config,
        ManufacturerPageRepositoryInterface $pageRepository,
        SlugHandler $slugHandler,
        ManufacturerUrl $manufacturerUrl,
        private readonly GetPageByIdentifierInterface $getPageByIdentifier,
        private readonly StoreManagerInterface $storeManager
    ) {
        parent::__construct($context, $config, $pageRepository, $slugHandler, $manufacturerUrl);
    }

    public function execute(): ResultInterface
    {
        $cmsPage = $this->getCmsPage();
        if (!$cmsPage?->isActive()) {
            return $this->notFound();
        }

        $resultPage = $this->resultFactory->create(ResultFactory::TYPE_PAGE);
        $pageConfig = $resultPage->getConfig();
        $pageConfig->getTitle()->set($cmsPage->getMetaTitle() ?: $cmsPage->getTitle());

        if ($cmsPage->getMetaDescription()) {
            $pageConfig->setDescription($cmsPage->getMetaDescription());
        }
        if ($cmsPage->getMetaKeywords()) {
            $pageConfig->setKeywords($cmsPage->getMetaKeywords());
        }

        $pageConfig->addRemotePageAsset(
            $this->getManufacturerUrl(),
            'canonical',
            ['attributes' => ['rel' => 'canonical']]
        );

        return $resultPage;
    }

    private function getCmsPage(): ?PageInterface
    {
        $identifier = trim((string)$this->getManufacturerPage()?->getCmsPage());
        if ($identifier === '') {
            return null;
        }

        try {
            return $this->getPageByIdentifier->execute($identifier, (int)$this->storeManager->getStore()->getId());
        } catch (NoSuchEntityException) {
            return null;
        }
    }
}
