<?php

namespace Autogedal\Extend\Cron;

use Magento\Framework\App\ResourceConnection;
use Magento\Store\Model\StoreManagerInterface;
use Magento\UrlRewrite\Model\UrlFinderInterface;
use Magento\UrlRewrite\Service\V1\Data\UrlRewrite;
use Magento\Framework\UrlInterface;
use Amasty\ShopbySeo\Helper\Url as SeoUrlHelper;
use Psr\Log\LoggerInterface;

class RefreshParavanthuriPages
{
    const CATEGORY_ID   = 2168;
    const BRAND_ATTR_ID = 747;
    const MODEL_ATTR_ID = 748;
    const YEAR_ATTR_ID  = 1253;
    const BRAND_CODE    = 'auto_brand';
    const MODEL_CODE    = 'auto_model';
    const YEAR_CODE     = 'auto_from_to_paravanturi';

    private $resource;
    private $storeManager;
    private $urlFinder;
    private $seoUrlHelper;
    private $logger;

    private $connection;
    private $baseUrl;
    private $catUrlPath;
    private $statusAttrId;

    public function __construct(
        ResourceConnection $resource,
        StoreManagerInterface $storeManager,
        UrlFinderInterface $urlFinder,
        SeoUrlHelper $seoUrlHelper,
        LoggerInterface $logger
    ) {
        $this->resource     = $resource;
        $this->storeManager = $storeManager;
        $this->urlFinder    = $urlFinder;
        $this->seoUrlHelper = $seoUrlHelper;
        $this->logger       = $logger;
    }

    public function execute()
    {
        $this->logger->info('RefreshParavanthuriPages: start');

        $this->connection = $this->resource->getConnection();
        $pageTable        = $this->resource->getTableName('amasty_amshopby_page');

        $this->statusAttrId = (int)$this->connection->fetchOne(
            "SELECT attribute_id FROM " . $this->resource->getTableName('eav_attribute') .
            " WHERE attribute_code = 'status' AND entity_type_id = 4"
        );

        /** @var \Magento\Store\Model\Store $store */
        $store   = $this->storeManager->getStore(1);
        $storeId = $store->getId();
        $this->storeManager->setCurrentStore($storeId);
        $this->baseUrl = rtrim($store->getBaseUrl(UrlInterface::URL_TYPE_WEB), '/');

        $rewrite = $this->urlFinder->findOneByData([
            UrlRewrite::ENTITY_TYPE   => 'category',
            UrlRewrite::ENTITY_ID     => self::CATEGORY_ID,
            UrlRewrite::STORE_ID      => $storeId,
            UrlRewrite::REDIRECT_TYPE => 0,
        ]);
        $this->catUrlPath = $rewrite
            ? str_replace('.html', '', $rewrite->getRequestPath())
            : 'paravanturi';

        $updated = 0;
        $skipped = 0;

        $brands = $this->getBrands();

        // ---- Pagini MARCA ----
        foreach ($brands as $brand) {
            $brandId   = $brand['option_id'];
            $brandName = $brand['brand_name'];

            $conditionsMarca = json_encode([
                json_encode(['filter' => (string)self::BRAND_ATTR_ID, 'value' => (string)$brandId])
            ]);

            $pageId = $this->connection->fetchOne(
                $this->connection->select()
                    ->from($pageTable, 'page_id')
                    ->where('conditions = ?', $conditionsMarca)
                    ->where('FIND_IN_SET(?, categories)', self::CATEGORY_ID)
            );

            if (!$pageId) {
                $skipped++;
                continue;
            }

            $models      = $this->collectModelsWithUrls($brandId, $brandName);
            $description = $this->buildBrandDescription($brandName, $models);

            $this->connection->update(
                $pageTable,
                ['description' => $description],
                ['page_id = ?' => $pageId]
            );
            $updated++;
        }

        // ---- Pagini MARCA+MODEL ----
        foreach ($brands as $brand) {
            $brandId   = $brand['option_id'];
            $brandName = $brand['brand_name'];

            foreach ($this->getModels($brandId) as $model) {
                $modelId   = $model['option_id'];
                $modelName = $model['model_name'];

                $conditionsBrandModel = json_encode([
                    json_encode(['filter' => (string)self::BRAND_ATTR_ID, 'value' => (string)$brandId]),
                    json_encode(['filter' => (string)self::MODEL_ATTR_ID, 'value' => (string)$modelId]),
                ]);

                $pageId = $this->connection->fetchOne(
                    $this->connection->select()
                        ->from($pageTable, 'page_id')
                        ->where('conditions = ?', $conditionsBrandModel)
                        ->where('FIND_IN_SET(?, categories)', self::CATEGORY_ID)
                );

                if (!$pageId) {
                    $skipped++;
                    continue;
                }

                $yearOptions = $this->getYearOptions($brandId, $modelId);
                $description = $this->buildModelDescription(
                    $brandName, $modelName, $brandId, $modelId, $yearOptions
                );

                $this->connection->update(
                    $pageTable,
                    ['description' => $description],
                    ['page_id = ?' => $pageId]
                );
                $updated++;
            }
        }

        $this->logger->info("RefreshParavanthuriPages: done. Updated=$updated Skipped=$skipped");
    }

    private function getBrands()
    {
        return $this->connection->fetchAll(
            $this->connection->select()
                ->from(['pei' => $this->resource->getTableName('catalog_product_entity_varchar')], [])
                ->joinInner(
                    ['eaov' => $this->resource->getTableName('eav_attribute_option_value')],
                    'eaov.option_id = pei.value AND eaov.store_id = 0',
                    ['option_id' => 'pei.value', 'brand_name' => 'eaov.value']
                )
                ->joinInner(
                    ['ccp' => $this->resource->getTableName('catalog_category_product')],
                    'ccp.product_id = pei.entity_id',
                    []
                )
                ->joinInner(
                    ['cpe_status' => $this->resource->getTableName('catalog_product_entity_int')],
                    'cpe_status.entity_id = pei.entity_id AND cpe_status.attribute_id = ' . $this->statusAttrId . ' AND cpe_status.store_id = 0 AND cpe_status.value = 1',
                    []
                )
                ->where('pei.attribute_id = ?', self::BRAND_ATTR_ID)
                ->where('ccp.category_id = ?', self::CATEGORY_ID)
                ->group('pei.value')
                ->order('eaov.value ASC')
        );
    }

    private function getModels($brandId)
    {
        return $this->connection->fetchAll(
            $this->connection->select()
                ->from(['pei_m' => $this->resource->getTableName('catalog_product_entity_varchar')], [])
                ->joinInner(
                    ['eaov_m' => $this->resource->getTableName('eav_attribute_option_value')],
                    'eaov_m.option_id = pei_m.value AND eaov_m.store_id = 0',
                    ['option_id' => 'pei_m.value', 'model_name' => 'eaov_m.value']
                )
                ->joinInner(
                    ['pei_b' => $this->resource->getTableName('catalog_product_entity_varchar')],
                    'pei_b.entity_id = pei_m.entity_id AND pei_b.attribute_id = ' . (int)self::BRAND_ATTR_ID . ' AND pei_b.value = ' . (int)$brandId,
                    []
                )
                ->joinInner(
                    ['ccp' => $this->resource->getTableName('catalog_category_product')],
                    'ccp.product_id = pei_m.entity_id',
                    []
                )
                ->joinInner(
                    ['cpe_status' => $this->resource->getTableName('catalog_product_entity_int')],
                    'cpe_status.entity_id = pei_m.entity_id AND cpe_status.attribute_id = ' . $this->statusAttrId . ' AND cpe_status.store_id = 0 AND cpe_status.value = 1',
                    []
                )
                ->where('pei_m.attribute_id = ?', self::MODEL_ATTR_ID)
                ->where('ccp.category_id = ?', self::CATEGORY_ID)
                ->group('pei_m.value')
                ->order('eaov_m.value ASC')
        );
    }

    private function getYearOptions($brandId, $modelId)
    {
        return $this->connection->fetchAll(
            $this->connection->select()
                ->from(['pei_y' => $this->resource->getTableName('catalog_product_entity_int')], ['option_id' => 'pei_y.value'])
                ->joinInner(
                    ['eaov_y' => $this->resource->getTableName('eav_attribute_option_value')],
                    'eaov_y.option_id = pei_y.value AND eaov_y.store_id = 0',
                    ['label' => 'eaov_y.value']
                )
                ->joinInner(
                    ['pei_b' => $this->resource->getTableName('catalog_product_entity_varchar')],
                    'pei_b.entity_id = pei_y.entity_id AND pei_b.attribute_id = ' . (int)self::BRAND_ATTR_ID . ' AND pei_b.value = ' . (int)$brandId,
                    []
                )
                ->joinInner(
                    ['pei_m' => $this->resource->getTableName('catalog_product_entity_varchar')],
                    'pei_m.entity_id = pei_y.entity_id AND pei_m.attribute_id = ' . (int)self::MODEL_ATTR_ID . ' AND pei_m.value = ' . (int)$modelId,
                    []
                )
                ->joinInner(
                    ['ccp' => $this->resource->getTableName('catalog_category_product')],
                    'ccp.product_id = pei_y.entity_id',
                    []
                )
                ->joinInner(
                    ['cpe_status' => $this->resource->getTableName('catalog_product_entity_int')],
                    'cpe_status.entity_id = pei_y.entity_id AND cpe_status.attribute_id = ' . $this->statusAttrId . ' AND cpe_status.store_id = 0 AND cpe_status.value = 1',
                    []
                )
                ->where('pei_y.attribute_id = ?', self::YEAR_ATTR_ID)
                ->where('ccp.category_id = ?', self::CATEGORY_ID)
                ->where('pei_y.value IS NOT NULL')
                ->group('pei_y.value')
                ->order('pei_y.value ASC')
        );
    }

    private function collectModelsWithUrls($brandId, $brandName)
    {
        $models = [];
        foreach ($this->getModels($brandId) as $model) {
            $modelId   = $model['option_id'];
            $modelName = $model['model_name'];

            $rawUrl = $this->baseUrl . '/' . $this->catUrlPath . '/?'
                . self::BRAND_CODE . '=' . $brandId
                . '&' . self::MODEL_CODE . '=' . $modelId;
            $seoUrl = $this->seoUrlHelper->seofyUrl($rawUrl, self::CATEGORY_ID, true) . '.html';

            $yearOptions = $this->getYearOptions($brandId, $modelId);
            $yearsString = empty($yearOptions) ? null : implode(', ', array_column($yearOptions, 'label'));

            $models[] = [
                'model_name' => $modelName,
                'url'        => $seoUrl,
                'years'      => $yearsString,
            ];
        }
        return $models;
    }

    private function buildBrandDescription($brandName, array $models)
    {
        $modelListItems = '';
        foreach ($models as $m) {
            $label = 'Paravanturi ' . $brandName . ' ' . $m['model_name'];
            $years = $m['years'] ? ' (' . $m['years'] . ')' : '';
            $modelListItems .= '<li><p><a href="' . $m['url'] . '">' . $label . '</a>' . $years . '</p></li>' . "\n";
        }

        return '<h2><strong>Ce sunt paravanturile auto și de ce sunt utile?</strong></h2>
<p>Paravanturile auto sunt accesorii exterioare de tip deflector care optimizează circulația aerului în interiorul habitaclului. Aceste accesorii permit ventilarea constantă a mașinii chiar și în condiții de ploaie sau ninsoare abundentă. Utilizarea paravanturilor previne aburirea rapidă a geamurilor prin reglarea naturală a curentului termic. Paravanturile Autogedal reduc semnificativ zgomotul produs de vânt în timpul deplasării cu viteză pe autostradă. Designul aerodinamic al acestor deflectoare direcționează fluxul de aer departe de zona superioară a geamului. Materialul acrilic de tip fumuriu oferă o protecție solară discretă și un aspect vizual modern vehiculului.</p>
<h2><strong>Care sunt avantajele paravanturilor dedicate HEKO?</strong></h2>
<p>Magazinul Autogedal comercializează paravanturi HEKO care sunt recunoscute global pentru precizia fabricației și durabilitatea ridicată. Deflectoarele HEKO sunt proiectate special pe forma ramei portierei pentru fiecare model de mașină în parte. Această compatibilitate tehnică asigură un montaj stabil și elimină riscul de blocare a sistemului electric de ridicare. Plexiglasul utilizat în producția HEKO este rezistent la șocuri mecanice și la expunerea îndelungată la raze UV. Paravanturile Autogedal își păstrează flexibilitatea și culoarea originală chiar și după ani de utilizare intensă. Instalarea unui set de deflectoare dedicate crește imediat nivelul de confort fără a necesita modificări structurale permanente.</p>
<h2><strong>Cum alegi setul de paravanturi potrivit pentru mașina ta?</strong></h2>
<p>Proprietarii de vehicule pot alege între un set de paravanturi față format din 2 piese sau un set complet. Setul pentru geamurile din față asigură confortul termic principal pentru șofer și pentru pasagerul din dreapta. Varianta completă este recomandată pentru familiile care călătoresc frecvent cu pasageri pe bancheta din spate. Filtrele disponibile în site-ul Autogedal permit selectarea rapidă a produselor după Marca și Modelul mașinii. Verificarea atentă a compatibilității garantează că piesa achiziționată se va fixa corect în canalul chederului original. Echipa Autogedal oferă asistență tehnică pentru identificarea corectă a setului de deflectoare HEKO necesar propriului vehicul.</p>
<p>Paravanturile ' . $brandName . ' sunt deflectoare de vant dedicate, proiectate sa se potriveasca pe canalul geamului lateral al fiecarui model ' . $brandName . '. Se fabrica din plexiglas (PMMA) sau policarbonat rezistent UV si se monteaza prin impingere in chederul portierelor, fara lipire sau gaurire.</p>
<h2><strong>Paravanturi ' . $brandName . ' - alege modelul tau</strong></h2>
<p>Autogedal ofera paravanturi ' . $brandName . ' in doua game:</p>
<ul>
<li><p>HEKO (fabricate in Polonia) - plexiglas fumuriu 3mm, cleme integrate din inox, livrare din stoc in 1-2 zile lucratoare</p></li>
<li><p>ART - policarbonat negru, montaj cu banda adeziva inclusa, livrare 3-5 zile pentru produsele in stoc sau 25-45 zile pentru produsele la comanda</p></li>
</ul>
<h3>Modele ' . $brandName . ' disponibile:</h3>
<ul>
' . $modelListItems . '</ul>';
    }

    private function buildModelDescription($brandName, $modelName, $brandId, $modelId, array $yearOptions)
    {
        $generatiiCount = count($yearOptions);
        $generatiiParts = [];

        foreach ($yearOptions as $i => $yearOpt) {
            $yearOptionId = $yearOpt['option_id'];
            $yearLabel    = $yearOpt['label'];
            $roman        = $this->toRoman($i + 1);

            $rawUrl = $this->baseUrl . '/' . $this->catUrlPath . '/?'
                . self::BRAND_CODE . '=' . $brandId
                . '&' . self::MODEL_CODE . '=' . $modelId
                . '&' . self::YEAR_CODE . '=' . $yearOptionId;
            $seoUrl = $this->seoUrlHelper->seofyUrl($rawUrl, self::CATEGORY_ID, true) . '.html';

            $generatiiParts[] = $modelName . ' ' . $roman . ' (<a href="' . $seoUrl . '">' . $yearLabel . '</a>)';
        }

        if (empty($generatiiParts)) {
            $generatiiText      = '';
            $generatiiCountText = '0 generatii';
        } else {
            $last          = array_pop($generatiiParts);
            $generatiiText = empty($generatiiParts)
                ? $last
                : implode(', ', $generatiiParts) . ' si ' . $last;
            $generatiiCountText = $generatiiCount . ' ' . ($generatiiCount === 1 ? 'generatie' : 'generatii');
        }

        return '<h2><strong>Ce sunt paravanturile auto și de ce sunt utile?</strong></h2>
<p>Paravanturile auto sunt accesorii exterioare de tip deflector care optimizează circulația aerului în interiorul habitaclului. Aceste accesorii permit ventilarea constantă a mașinii chiar și în condiții de ploaie sau ninsoare abundentă. Utilizarea paravanturilor previne aburirea rapidă a geamurilor prin reglarea naturală a curentului termic. Paravanturile Autogedal reduc semnificativ zgomotul produs de vânt în timpul deplasării cu viteză pe autostradă. Designul aerodinamic al acestor deflectoare direcționează fluxul de aer departe de zona superioară a geamului. Materialul acrilic de tip fumuriu oferă o protecție solară discretă și un aspect vizual modern vehiculului.</p>
<h2><strong>Care sunt avantajele paravanturilor dedicate HEKO?</strong></h2>
<p>Magazinul Autogedal comercializează paravanturi HEKO care sunt recunoscute global pentru precizia fabricației și durabilitatea ridicată. Deflectoarele HEKO sunt proiectate special pe forma ramei portierei pentru fiecare model de mașină în parte. Această compatibilitate tehnică asigură un montaj stabil și elimină riscul de blocare a sistemului electric de ridicare. Plexiglasul utilizat în producția HEKO este rezistent la șocuri mecanice și la expunerea îndelungată la raze UV. Paravanturile Autogedal își păstrează flexibilitatea și culoarea originală chiar și după ani de utilizare intensă. Instalarea unui set de deflectoare dedicate crește imediat nivelul de confort fără a necesita modificări structurale permanente.</p>
<h2><strong>Cum alegi setul de paravanturi potrivit pentru mașina ta?</strong></h2>
<p>Proprietarii de vehicule pot alege între un set de paravanturi față format din 2 piese sau un set complet. Setul pentru geamurile din față asigură confortul termic principal pentru șofer și pentru pasagerul din dreapta. Varianta completă este recomandată pentru familiile care călătoresc frecvent cu pasageri pe bancheta din spate. Filtrele disponibile în site-ul Autogedal permit selectarea rapidă a produselor după Marca și Modelul mașinii. Verificarea atentă a compatibilității garantează că piesa achiziționată se va fixa corect în canalul chederului original. Echipa Autogedal oferă asistență tehnică pentru identificarea corectă a setului de deflectoare HEKO necesar propriului vehicul.</p>
<p>Paravanturile ' . $brandName . ' ' . $modelName . ' sunt deflectoare de vant dedicate, disponibile pentru ' . $generatiiCountText . ': ' . $generatiiText . '. Fiecare generatie foloseste un tipar diferit al portierelor, ceea ce face seturile neinterschimbabile intre generatii. Anul de fabricatie din talonul auto indica generatia corecta.</p>
<h2><strong>Paravanturi ' . $brandName . ' ' . $modelName . ' - preturi si livrare</strong></h2>
<p>Paravanturile HEKO pentru ' . $brandName . ' ' . $modelName . ' sunt fabricate din plexiglas fumuriu de 3mm cu cleme integrate din inox - se monteaza prin impingere in chederul portierelor, fara scule sau modificari. Setul fata contine 2 piese iar setul fata+spate contine 4 piese. Livrare din stoc in 1-2 zile lucratoare.</p>
<p>Alternativa economica este gama ART, din policarbonat negru cu fixare prin banda adeziva 3M inclusa in pachet. Setul fata contine 2 piese iar setul fata+spate contine 4 piese. Livrare din stoc in 3-5 zile lucratoare.</p>';
    }

    private function toRoman($n)
    {
        $map = [1 => 'I', 2 => 'II', 3 => 'III', 4 => 'IV', 5 => 'V',
                6 => 'VI', 7 => 'VII', 8 => 'VIII', 9 => 'IX', 10 => 'X'];
        return $map[$n] ?? (string)$n;
    }
}
