<?php
declare(strict_types=1);

namespace Autogedal\Manufacturers\Model;

use Autogedal\Manufacturers\Api\Data\ManufacturerPageInterface;
use Autogedal\Manufacturers\Model\ResourceModel\ManufacturerPage\CollectionFactory;
use Magento\Cms\Model\ResourceModel\Page as CmsPageResource;
use Magento\Framework\UrlInterface;
use Magento\Store\Model\StoreManagerInterface;

class ManufacturerUrl
{
    public const URL_PREFIX = 'producator-';

    public function __construct(
        private readonly UrlInterface $urlBuilder,
        private readonly Config $config,
        private readonly CollectionFactory $collectionFactory,
        private readonly CmsPageResource $cmsPageResource,
        private readonly StoreManagerInterface $storeManager
    ) {
    }

    public function getUrl(string $slug): string
    {
        return $this->urlBuilder->getUrl('', ['_direct' => self::URL_PREFIX . $slug]);
    }

    public function getUrlByOptionId($optionId): ?string
    {
        if (!$this->config->isEnabled() || !$this->config->isManufacturerActive((int)$optionId)) {
            return null;
        }

        $page = $this->collectionFactory->create()
            ->addFieldToFilter(ManufacturerPageInterface::OPTION_ID, $optionId)
            ->addFieldToFilter(ManufacturerPageInterface::CMS_PAGE, ['notnull' => true])
            ->setPageSize(1)
            ->getFirstItem();

        return $page->getId() && $this->isCmsPageAvailable((string)$page->getCmsPage())
            ? $this->getUrl($page->getSlug())
            : null;
    }

    private function isCmsPageAvailable(string $identifier): bool
    {
        return (bool)$this->cmsPageResource->checkIdentifier(
            $identifier,
            (int)$this->storeManager->getStore()->getId()
        );
    }
}
