<?php
declare(strict_types=1);

namespace Autogedal\Manufacturers\Controller;

use Autogedal\Manufacturers\Api\ManufacturerPageRepositoryInterface;
use Autogedal\Manufacturers\Model\ManufacturerUrl;
use Autogedal\Manufacturers\Service\SlugHandler;
use Magento\Framework\App\Action\Forward;
use Magento\Framework\App\ActionFactory;
use Magento\Framework\App\ActionInterface;
use Magento\Framework\App\RequestInterface;
use Magento\Framework\App\RouterInterface;
use Magento\Framework\Exception\NoSuchEntityException;

class Router implements RouterInterface
{
    private const LEGACY_URL_PREFIX = 'manufacturer-';
    private const URL_PATTERN = '/^(' . ManufacturerUrl::URL_PREFIX . '|' . self::LEGACY_URL_PREFIX . ')([a-z0-9-]+)$/';

    public function __construct(
        private readonly ActionFactory $actionFactory,
        private readonly ManufacturerPageRepositoryInterface $pageRepository,
        private readonly SlugHandler $slugHandler
    ) {
    }

    public function match(RequestInterface $request): ?ActionInterface
    {
        if ($request->getModuleName()) {
            return null;
        }

        $identifier = trim($request->getPathInfo(), '/');
        if (preg_match(self::URL_PATTERN, $identifier, $matches) !== 1) {
            return null;
        }

        [, $prefix, $slug] = $matches;
        $isLegacy = $prefix === self::LEGACY_URL_PREFIX;
        if (!$this->slugHandler->validateSlug($slug) || ($isLegacy && !$this->pageExists($slug))) {
            return null;
        }

        $request->setModuleName('producatori');
        $request->setControllerName('index');
        $request->setActionName($isLegacy ? 'legacyRedirect' : 'view');
        $request->setParam('slug', $slug);

        return $this->actionFactory->create(Forward::class, ['request' => $request]);
    }

    private function pageExists(string $slug): bool
    {
        try {
            $this->pageRepository->getBySlug($slug);
        } catch (NoSuchEntityException) {
            return false;
        }

        return true;
    }
}
