<?php

namespace Leadlion\Autogedal\Helper;

use Amasty\ShopbySeo\Model\SeoOptions;
use Magento\Framework\App\Helper\AbstractHelper;
use Magento\Framework\App\Helper\Context;
use Magento\Store\Model\StoreManagerInterface;
use Amasty\ShopbySeo\Model\UrlParser\Attribute;

class UrlParser extends \Amasty\ShopbySeo\Helper\UrlParser
{
    /**
     * @var  Data
     */
    protected $seoHelper;

    /**
     * @var string
     */
    protected $aliasDelimiter;

    /**
     * @var Config
     */
    private $config;

    /**
     * @var SeoOptions
     */
    private $seoOptions;

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

    public function __construct(
        Context $context,
        \Amasty\ShopbySeo\Helper\Data $seoHelper,
        \Amasty\ShopbySeo\Helper\Config $config,
        SeoOptions $seoOptions,
        StoreManagerInterface $storeManager,
        Attribute $attribute
    ) {
        parent::__construct(
            $context,
            $seoHelper,
            $config,
            $seoOptions,
            $storeManager,
            $attribute
        );
        $this->seoHelper = $seoHelper;
        $this->config = $config;
        $this->aliasDelimiter = $this->config->getOptionSeparator() ?: '-';
        $this->seoOptions = $seoOptions;

        $this->storeManager = $storeManager;
    }

    /**
     * @param $value
     * @param $paramName
     * @param $params
     * @return mixed
     */
    private function addParsedOptionToParams($value, $paramName, $params)
    {
        if (array_key_exists($paramName, $params)) {
            $params[$paramName] .= ',' . $value;
        } else {
            $params[$paramName] = '' . $value;
        }

        return $params;
    }
    
    /**
     * @param $seoPart
     * @return array
     */
    public function parseSeoPart($seoPart)
    {
        $seoPart = str_replace('/', $this->aliasDelimiter, $seoPart);
        // if ($this->seoHelper->isIncludeAttributeName()) {
        //     return $this->attribute->parse($seoPart);
        // }

        if ($this->aliasDelimiter == $this->seoHelper->getSpecialChar()) {
            $aliases = $this->parseAliasesRecursive($seoPart);
            return $this->parseAliasesOldAlgorythm($aliases, $seoPart);
        }

        $aliases = $this->getAliases($seoPart);
        return $this->parseAliases($aliases);
    }

    private function replaceAliases(array $aliases): array
    {
        $store = $this->storeManager->getStore()->getId();
        foreach ($this->seoHelper->getAttributeUrlAliases() as $attribute => $alias) {
            if (isset($alias[$store])) {
                $key = array_search($alias[$store], $aliases);
                if ($key !== false) {
                    $aliases[$key] = $attribute;
                }
            }
        }

        return $aliases;
    }

    /**
     * @param array $aliases
     * @return array
     */
    protected function parseAliases($aliases)
    {
        $attributeOptionsData = $this->seoOptions->getData();
        $filterWord = $this->seoHelper->getFilterWord();
        $aliases = $this->replaceAliases($aliases);
        $paramsCount = 0;
        $params = [];
        $parsedAliases = [];
        $parsedAttributeNameCount = 0;
        $urlAttributes = [];
        foreach ($aliases as $key => $currentAlias) {
            if (in_array($currentAlias, array_keys($attributeOptionsData))) {
                $urlAttributes[] = $aliases[$key];
            }
        }
        foreach ($aliases as $key => $currentAlias) {
            if (in_array($currentAlias, array_keys($attributeOptionsData))
                && !in_array($currentAlias, $attributeOptionsData[$currentAlias])
                || $currentAlias == $filterWord) {
                unset($aliases[$key]);
                $parsedAttributeNameCount++;
                continue;
            }

            foreach ($attributeOptionsData as $attributeCode => $optionsData) {
                foreach ($optionsData as $optionId => $alias) {
                    if ($alias === $currentAlias && in_array($attributeCode, $urlAttributes)) {
                        $parsedAliases[] = $currentAlias;
                        $params = $this->addParsedOptionToParams($optionId, $attributeCode, $params);
                        unset($attributeOptionsData[$attributeCode]);
                        $paramsCount++;
                        continue 3;
                    }
                }
            }
        }
        if ($this->seoHelper->isIncludeAttributeName() && $parsedAttributeNameCount != count($params)) {
            return [];
        }

        return $paramsCount == count($aliases)  ? $params : [];
    }
}
