<?php

namespace Leadlion\Autogedal\Plugin;

use Leadlion\Autogedal\Plugin\UrlProcessor;
use Magento\Backend\Model\View\Result\Redirect;
use Magento\Backend\Model\View\Result\RedirectFactory;
use Magento\Framework\App\FrontControllerInterface;
use Magento\Framework\App\RequestInterface;
use Magento\Framework\Exception\LocalizedException;
use Magento\Framework\Exception\NoSuchEntityException;
use Magento\Store\Model\StoreManagerInterface;
use Magento\UrlRewrite\Model\UrlFinderInterface;
use Magento\UrlRewrite\Service\V1\Data\UrlRewrite;
use Magento\Framework\Url\Helper\Data;

class Action
{
    public const URL_TRIM_CHARACTER = '/';

    /**
     * @var Data
     */
    private $urlHelper;

    /**
     * @var StoreManagerInterface
     */
    private $storeManager;

    /**
     * @var RedirectFactory
     */
    private $resultRedirectFactory;

    /**
     * @var UrlFinderInterface
     */
    private $urlFinder;

    /**
     * @var UrlProcessor
     */
    private $urlProcessor;

    public function __construct(
        StoreManagerInterface $storeManager,
        RedirectFactory $resultRedirectFactory,
        UrlFinderInterface $urlFinder,
        UrlProcessor $urlProcessor,
        Data $urlHelper
    ) {
        $this->urlFinder = $urlFinder;
        $this->storeManager = $storeManager;
        $this->urlProcessor = $urlProcessor;
        $this->resultRedirectFactory = $resultRedirectFactory;
        $this->urlHelper = $urlHelper;
    }

    /**
     * @param FrontControllerInterface $subject
     * @param \Closure $proceed
     * @param RequestInterface $request
     * @return Redirect
     * @throws LocalizedException
     * @throws NoSuchEntityException
     */
    public function aroundDispatch(
        FrontControllerInterface $subject,
        \Closure $proceed,
        RequestInterface $request
    ) {
        return $proceed($request);
    
        $resultRedirect = $this->resultRedirectFactory->create();

        $rewrite = $this->urlFinder->findOneByData([
            UrlRewrite::ENTITY_TYPE => 'product',
            UrlRewrite::REQUEST_PATH => ltrim($request->getPathInfo(), '/'),
            UrlRewrite::STORE_ID => $this->storeManager->getStore()->getId(),
        ]);
        if ($rewrite && $rewrite->getMetadata()) {
            $rewriteToProductSimpleUrl = $this->urlFinder->findOneByData([
                UrlRewrite::ENTITY_ID => $rewrite->getEntityId(),
                UrlRewrite::STORE_ID => $this->storeManager->getStore()->getId(),
                UrlRewrite::METADATA => ['eq' => null]
            ]);
            if ($rewriteToProductSimpleUrl) {
                $store = $this->storeManager->getStore();
                $currentStoreUrl = str_replace('&amp;', '&', $store->getCurrentUrl(false));
                $redirectStoreUrl = trim($currentStoreUrl, '/');

                $redirectStoreUrl = $this->urlHelper->removeRequestParam($redirectStoreUrl, '___store');
                return $resultRedirect->setUrl(
                    str_replace(
                        ltrim($request->getPathInfo(), '/'),
                        $rewriteToProductSimpleUrl->getRequestPath(),
                        $redirectStoreUrl
                    )
                )->setHttpResponseCode(301);
            }
        }
        

        return $proceed($request);
    }
}
