<?php 
 
namespace PortalBundle\Controller; 
 
use CoreBundle\Component\CoreFormFactory; 
use CoreBundle\Component\FormManager; 
use CoreBundle\Entity\Model; 
use CoreBundle\Entity\Vehicles\RecommendGroup; 
use CoreBundle\Model\Vehicles\Repository; 
use CoreBundle\Services\MediaExtensionVidi; 
use DcSiteBundle\Model\Pagination; 
use Doctrine\ORM\EntityManagerInterface; 
use PortalBundle\Model\Catalog; 
use PortalBundle\Model\SeoMetaTag; 
use PortalBundle\Services\CatalogService; 
use PortalBundle\Services\ServiceService; 
use PortalBundle\Services\VehicleFilterService; 
use Symfony\Component\HttpFoundation\JsonResponse; 
use CoreBundle\Entity\Brand; 
use CoreBundle\Entity\Dealer; 
use CoreBundle\Entity\Forms; 
use CoreBundle\Model\Vehicles\Vehicle; 
use CoreBundle\Model\Vehicles\VehicleType; 
use PortalBundle\Enums\CatalogEnum; 
use Symfony\Component\HttpFoundation\Request; 
use Symfony\Component\HttpFoundation\RequestStack; 
use Symfony\Component\HttpKernel\Exception\NotFoundHttpException; 
use Symfony\Component\Routing\RouterInterface; 
 
/** 
 * Class CatalogController 
 * @package PortalBundle\Controller 
 */ 
class CatalogController extends BaseController 
{ 
    private Catalog $modelCatalog; 
    private Pagination $modelPagination; 
    private CatalogService $catalogService; 
    private MediaExtensionVidi $mediaExtensionVidi; 
    private SeoMetaTag $seoMetaTag; 
    public function __construct(RouterInterface $router, Catalog $modelCatalog, Pagination $modelPagination, 
                                CatalogService $catalogService, MediaExtensionVidi $mediaExtensionVidi, 
                                SeoMetaTag $seoMetaTag, CoreFormFactory $coreFormFactory, RequestStack $requestStack, 
                                Repository $vehicleRepository, ServiceService $serviceService) 
    { 
        parent::__construct($coreFormFactory, $requestStack, $router, $vehicleRepository, $serviceService); 
        $this->modelCatalog = $modelCatalog; 
        $this->modelPagination = $modelPagination; 
        $this->catalogService = $catalogService; 
        $this->mediaExtensionVidi = $mediaExtensionVidi; 
        $this->seoMetaTag = $seoMetaTag; 
    } 
 
    const PRE_PAGES = 15; 
    const MAX_PAGINATION_BUTTON = 5; 
 
    // Сторінка для тестування 
    public function catalog(Request $request, EntityManagerInterface $em) 
    { 
        $routeParams = $request->attributes->get('_route_params'); 
        $searchParams = $request->query->all(); 
        $cookies = $request->cookies->get('compare'); 
        $findVehicles = $this->modelCatalog->findByParams($routeParams, $searchParams, self::PRE_PAGES); 
        if(!$findVehicles['data']){ 
            $findVehicles = $this->modelCatalog->noFindVehicleByParams($routeParams, $searchParams, self::PRE_PAGES); 
        } 
 
        $vehicles = $this->modelCatalog->getVehicleByCatalog($this->getUser(), $findVehicles['data'], $routeParams, $cookies); 
        $pagination = $this->modelPagination->initPagination($findVehicles['count'], self::PRE_PAGES, 5); 
        $type = $request->get('type'); 
        $state = $request->get('state'); 
        $hasCredit = $request->get('credit'); 
        $brand = $request->get('brand'); 
 
        if (($brand && $brand === 'all') || ($state && $state === 'all')) { 
            throw new NotFoundHttpException(); 
        } 
 
        $model = $request->get('model'); 
        $findModelUrl = (isset($searchParams['m-model'])) ? key($searchParams['m-model']) : $request->get('model'); 
        $param = $request->get('param'); 
        $valueParam = $request->get('value'); 
        $group = $request->get('group'); 
 
        $typeData = VehicleType::getTypeDataByUrl($type); 
        if (!$typeData || $request->get('type') == 'special') { 
            throw new NotFoundHttpException(); 
        } 
        $vehicleTypeId = $typeData['id']; 
 
        $service = $this->catalogService; 
        $filters = $service->getFilters($searchParams, $request->getLocale(), $state, $vehicleTypeId, $brand, $model, $param, $valueParam, $routeParams, $group); 
 
        if ($request->isXmlHttpRequest()) { 
            return $this->json([ 
                'vehicles' => $service->getAjaxResult($vehicles, $request->getLocale()), 
                'pagination' => $pagination, 
                'count' => $findVehicles['count'], 
                'searchFilters' => $filters, 
                'hasCredit' => $hasCredit 
            ]); 
        } 
 
//        if ($findVehicles['count'] === 0) { 
//            throw new NotFoundHttpException(); 
//        } 
 
        $brandEm = $em->getRepository(Brand::class)->getBrandByUrl($brand); 
 
        if ($findModelUrl) { 
            $modelEm = $em->getRepository(Model::class)->findOneByUrl($findModelUrl, $brandEm); 
        } else { 
            $modelEm = null; 
        } 
 
        $catalogNav = $this->modelCatalog->getCatalogNav($type, $state, $hasCredit, $brand, $param, $valueParam, $group); 
 
        if(!$modelEm){ 
            $vehicleTopViews = $this->modelCatalog->getVehicleTopViews(5, $brandEm); 
        }else{ 
            $vehicleTopViews= $this->modelCatalog->getVehicleItemTopViews(5, $brandEm, $modelEm); 
        } 
 
        if ($hasCredit && !$brandEm) { 
            $randomTopViews = $this->modelCatalog->getRandomBrand(5); 
        } elseif ($hasCredit) { 
            $randomTopViews = $this->modelCatalog->getRandomModelBrand(999, $brandEm, $modelEm); 
        } 
 
        $dealers = $em->getRepository(Dealer::class)->getDealerByBrandUrl($brandEm); 
 
        if (!$brand && ($routeParams['type'] == 'truck' || $routeParams['type'] == 'bus')) { 
            $brandSId = []; 
            foreach ($vehicles as $vehicle) { 
                $brandSId[] = $vehicle['dealer']; 
            } 
            $dealers = $em->getRepository(Dealer::class)->findBy(['id' => $brandSId]); 
        } 
 
        $dealers = array_filter($dealers, fn($dealer) => $dealer->getId() !== 39); 
 
        $seoLinks = $this->seoMetaTag->buildSeoLinks($routeParams, $request->getLocale()); 
        $seoLinks = $service->seoYearsLinksFilter($routeParams, $vehicles, $searchParams, $seoLinks); 
 
        $isUsed = $state == 'used'; 
        $catalogCharacteristic = $service->catalogCharacteristic($vehicleTypeId, $isUsed); 
 
        $OrderCallForm = new Forms(); 
        $OrderCallForm = $this->CoreFormFactory()->orderCallForm($OrderCallForm, $brandEm ? $brandEm->getDealer()[0] : null, 1)->createView(); 
 
 
        return $this->basePortalRender('@Portal/Catalog/index.html.twig', [ 
            'vehicles' => $vehicles, 
            'seoLinks' => $seoLinks, 
            'pagination' => $pagination, 
            'filters' => $filters, 
            'catalogNav' => $catalogNav, 
            'baseParams' => $routeParams, 
            'searchParams' => $searchParams, 
            'dealers' => $dealers, 
            'vehicleTopViews' => $vehicleTopViews, 
            'randomTopViews' => $randomTopViews ?? null, 
            'minMaxPrice' => $findVehicles['minMaxPrice'] ?? 0, 
            'minMaxCreditPayment' => $findVehicles['minMaxCreditPayment'] ?? 0, 
            'count' => $findVehicles['count'], 
            'type' => $routeParams['type'], 
            'state' => $routeParams['state'], 
            'group' => $routeParams['group'] ?? null, 
            'hasCredit' => $hasCredit, 
            'brand' => $brand, 
            'brandEm' => $brandEm, 
            'model' => $model, 
            'modelEm' => $modelEm, 
            'param' => $param, 
            'value' => $request->get('value'), 
            'year' => ($param === 1000) ? $param : $valueParam, 
            'seoMeta' => $this->seoMetaTag->buildSeoMeta($request), 
            'valueParam' => $catalogCharacteristic[$param][$valueParam] ?? null, 
            'catalogBanner' => $service->getCatalogBanner($request), 
            'OrderCallForm' => $OrderCallForm ?? '', 
        ]); 
    } 
 
    /** 
     * @param Request $request 
     * @return JsonResponse 
     */ 
    public function buildFilters(Request $request): JsonResponse 
    { 
        $filters = $this->modelCatalog->buildFilters($request->request->all(), $request->getLocale()); 
 
        return $this->json($filters); 
    } 
 
    /** 
     * @param Request $request 
     * @return JsonResponse 
     */ 
    public function getDealersFromSelectedFilter(Request $request, EntityManagerInterface $em): JsonResponse 
    { 
        $data = json_decode($request->getContent(), true); 
        $dealers = []; 
 
        foreach ($data as $brandUrl => $key) { 
            if ($key) { 
                $brandEm = $em->getRepository(Brand::class)->getBrandByUrl($brandUrl); 
                $dealer = $em->getRepository(Dealer::class)->getCarDealer($brandEm); 
 
                if (count($dealer) > 1) { 
                    foreach ($dealer as $oneDealer) { 
                        $dealers[] = [ 
                            'id' => $oneDealer->getId(), 
                            'name' => $oneDealer->getNameByLocale($request->getLocale()), 
                            'brandName' => $oneDealer->getBrand()->getName(), 
                            'domain' => $oneDealer->getDomain(), 
                            'logo' => $this->mediaExtensionVidi->getPath($oneDealer->getBrand()->getLogo(), 'reference'), 
                            'address' => $oneDealer->getAddressByLocale($request->getLocale()), 
                            'phone' => $oneDealer->getPhone(), 
                            'mapUrl' => 'https://maps.google.com/maps?q=' . $oneDealer->getLat() . ',' . $oneDealer->getLng() . '&hl=' . $request->getLocale(), 
                        ]; 
                    } 
                    // Для дилерів з одним брендом 
                } else { 
                    if ($dealer) { 
                        $dealer = $dealer[0]; 
                        $dealers[] = [ 
                            'id' => $dealer->getId(), 
                            'name' => $dealer->getNameByLocale($request->getLocale()), 
                            'brandName' => $dealer->getBrand()->getName(), 
                            'domain' => $dealer->getDomain(), 
                            'logo' => $this->mediaExtensionVidi->getPath($dealer->getBrand()->getLogo(), 'reference'), 
                            'address' => $dealer->getAddressByLocale($request->getLocale()), 
                            'phone' => $dealer->getPhone(), 
                            'mapUrl' => 'https://maps.google.com/maps?q=' . $dealer->getLat() . ',' . $dealer->getLng() . '&hl=' . $request->getLocale(), 
                        ]; 
                    } 
                } 
            } 
        } 
 
        $dealers = array_filter($dealers, fn($dealer) => $dealer['id'] !== 39); 
 
        return $this->json($dealers); 
    } 
 
    /** 
     * @param Request $request 
     * @return JsonResponse 
     */ 
    public function getDealersFromFilter(Request $request, EntityManagerInterface $em): JsonResponse 
    { 
        $data = json_decode($request->getContent(), true); 
        $dealers = []; 
 
        foreach ($data as $brand) { 
            $brandEm = $em->getRepository(Brand::class)->getBrandByUrl($brand['url']); 
            $dealer = $em->getRepository(Dealer::class)->getCarDealer($brandEm); 
            // Для дилерів з декількома брендами 
            if (count($dealer) > 1) { 
                foreach ($dealer as $oneDealer) { 
                    $dealers[] = [ 
                        'id' => $oneDealer->getId(), 
                        'name' => $oneDealer->getNameByLocale($request->getLocale()), 
                        'brandName' => $oneDealer->getBrand()->getName(), 
                        'domain' => $oneDealer->getDomain(), 
                        'logo' => $this->mediaExtensionVidi->getPath($oneDealer->getBrand()->getLogo(), 'reference'), 
                        'address' => $oneDealer->getAddressByLocale($request->getLocale()), 
                        'phone' => $oneDealer->getPhone(), 
                        'mapUrl' => 'https://maps.google.com/maps?q=' . $oneDealer->getLat() . ',' . $oneDealer->getLng() . '&hl=' . $request->getLocale(), 
                    ]; 
                } 
                // Для дилерів з одним брендом 
            } else { 
                if ($dealer) { 
                    $dealer = $dealer[0]; 
                    $dealers[] = [ 
                        'id' => $dealer->getId(), 
                        'name' => $dealer->getNameByLocale($request->getLocale()), 
                        'brandName' => $dealer->getBrand()->getName(), 
                        'domain' => $dealer->getDomain(), 
                        'logo' => $this->mediaExtensionVidi->getPath($dealer->getBrand()->getLogo(), 'reference'), 
                        'address' => $dealer->getAddressByLocale($request->getLocale()), 
                        'phone' => $dealer->getPhone(), 
                        'mapUrl' => 'https://maps.google.com/maps?q=' . $dealer->getLat() . ',' . $dealer->getLng() . '&hl=' . $request->getLocale(), 
                    ]; 
                } 
            } 
        } 
 
        $dealers = array_filter($dealers, fn($dealer) => $dealer['id'] !== 39); 
 
        return $this->json($dealers); 
    } 
 
 
    /** 
     * @param Request $request 
     * @return JsonResponse 
     */ 
    public function buildUrl(Request $request) 
    { 
        $params = $request->request->all(); 
        $type = $params['type']; 
        $state = $params['state']; 
        $brand = $params['brand'] ?? null; 
        $model = $params['model'] ?? null; 
        $hasCredit = $params['hasCredit'] ?? null; 
        $isAjax = $params['isAjax'] ?? null; 
 
        if (is_array($brand) && count($brand) == 1) { 
            $brand = array_keys($brand)[0]; 
        } 
        if (is_array($model) && count($model) == 1) { 
            $model = array_keys($model)[0]; 
        } 
 
        $baseRouteParams = [ 
            'type' => $type, 
            'state' => $state, 
        ]; 
 
        $getParams = []; 
        foreach ($params as $key => $row) { 
            if (!in_array($key, ['type', 'state', 'brand', 'model', 'dynamic', 'hasCredit']) && $row) { 
                $getParams[$key] = $row; 
            } 
        } 
 
        if (is_array($brand)) { 
            $getParams['m-brand'] = $brand; 
            $brand = null; 
        } else if ($brand) { 
            $getParams['m-brand'] = [$brand => true]; 
        } 
        if (is_array($model)) { 
            $getParams['m-model'] = $model; 
            $model = null; 
        } else if ($model) { 
            $getParams['m-model'] = [$model => true]; 
            $model = null; 
        } 
 
        $dynamic = []; 
        if (isset($params['dynamic'])) { 
            foreach ($params['dynamic'] as $id => $values) { 
                if (array_key_exists('from', $values) || array_key_exists('to', $values)) { 
                    $dynamic[$id] = $values; 
                } else { 
                    foreach ($values as $url => $v) { 
                        if ($v != 'false') { 
                            $dynamic[$id][$url] = 1; 
                        } 
                    } 
                } 
            } 
        } 
 
        $catalogCharacteristic = array_flip($this->modelCatalog->getCatalogCharacteristicsId()); 
        if (!$brand && !$model && (!count($dynamic) || empty(array_intersect_key($dynamic, $catalogCharacteristic)))) { 
            $url = $this->router 
                ->generate( 
                    ($hasCredit) ? CatalogEnum::ROUTE_PORTAL_CREDIT_CATALOG : CatalogEnum::ROUTE_PORTAL_CATALOG, 
                    array_merge($baseRouteParams, $getParams, ['dynamic' => $dynamic]) 
                ); 
            return $this->json(['url' => $url]); 
        } 
 
        if (!$brand && !$model && count($dynamic)) { 
            $dId = key($dynamic); 
            $value = key($dynamic[$dId]); 
            if (!count($dynamic[$dId])) { 
                unset($dynamic[$dId]); 
            } 
            $baseRouteParams['param'] = $dId; 
            $baseRouteParams['value'] = $value; 
            $url = $this->router 
                ->generate( 
                    ($hasCredit) ? CatalogEnum::ROUTE_PORTAL_CREDIT_CATALOG_PARAM : CatalogEnum::ROUTE_PORTAL_CATALOG_PARAM, 
                    array_merge($baseRouteParams, $getParams, ['dynamic' => $dynamic]) 
                ); 
            return $this->json(['url' => $url]); 
        } 
 
        if ($model) { 
            $baseRouteParams['model'] = $model; 
            $baseRouteParams['brand'] = $brand; 
            $url = $this->router 
                ->generate( 
                    ($hasCredit) ? CatalogEnum::ROUTE_PORTAL_CREDIT_CATALOG_BM_NAME : CatalogEnum::ROUTE_PORTAL_CATALOG_BM_NAME, 
                    array_merge($baseRouteParams, $getParams, ['dynamic' => $dynamic]) 
                ); 
            return $this->json(['url' => $url]); 
        } 
 
        if ($brand) { 
            $baseRouteParams['brand'] = $brand; 
            $url = $this->router 
                ->generate( 
                    ($hasCredit) ? CatalogEnum::ROUTE_PORTAL_CREDIT_CATALOG_B_NAME : CatalogEnum::ROUTE_PORTAL_CATALOG_B_NAME, 
                    array_merge($baseRouteParams, $getParams, ['dynamic' => $dynamic]) 
                ); 
            return $this->json(['url' => $url]); 
        } 
    } 
 
 
    public function catalogCategory(Request $request, $url, EntityManagerInterface $em,  \CoreBundle\Factory\Vehicle $vehicleFactory) 
    { 
        $dealers = $em->getRepository(Dealer::class)->getCarDealer(); 
 
        $recommends = $em->getRepository(RecommendGroup::class)->findBy(['state' => 1]); 
        $recommendGroup = $em->getRepository(RecommendGroup::class)->findOneBy(['url' => $url]); 
 
 
        $recommendGroupVehicles = $em->getRepository(\CoreBundle\Entity\Vehicles\Vehicle::class)->getVehicleByRecommendGroupUrl(['url' => $url]); 
 
        $vehicles = $vehicleFactory->createByEntities($recommendGroupVehicles); 
 
        $sort = $request->get('sort'); 
 
        usort($vehicles, function (Vehicle $a, Vehicle $b) use ($sort) { 
            switch ($sort) { 
                case 'price-DESC': 
                    return $a->fullPrice() < $b->fullPrice(); 
                default: 
                    return $a->fullPrice() > $b->fullPrice(); 
            } 
        }); 
        $seoMeta = []; 
        $urn = preg_replace('/^(\/?ua\/|\/?ru\/)/', '/', $request->getRequestUri()); 
        $seo = $em->getRepository(\CoreBundle\Entity\SeoMetaTag::class) 
            ->findOneBy(['domain' => $request->getHost(), 'urn' => $urn]); 
        if ($seo && $seo->getState()) { 
            $seoMeta = [ 
                'title' => $seo->getTitle($request->getLocale()), 
                'description' => $seo->getDescription($request->getLocale()), 
                'h1' => $seo->getH1($request->getLocale()), 
                'robots' => $seo->getRobots(), 
            ]; 
        } 
 
        return $this->basePortalRender('@Portal/Car/category.html.twig', [ 
            'dealers' => $dealers, 
            'recommends' => $recommends, 
            'recommendGroup' => $recommendGroup, 
            'vehicles' => $vehicles, 
            'url' => $url, 
            'seoMeta' => $seoMeta, 
        ]); 
    } 
 
    //TODO remove this magic numbers 
    private function createPaginator($data, $page = 1, $limit = 21) 
    { 
        $maxPages = 10; 
        $paginator = [ 
            'total' => ceil(count($data) / $limit), 
            'current' => $page, 
        ]; 
 
        if ($paginator['total'] > $maxPages && $page > floor($maxPages / 2)) { 
            $paginator['start'] = $page - floor($maxPages / 2); 
            $paginator['end'] = $paginator['start'] + $maxPages - 1; 
        } else { 
            $paginator['start'] = 1; 
            $paginator['end'] = min($paginator['total'], $maxPages); 
        } 
 
        return $paginator; 
    } 
 
    public function getChangeFilter(VehicleFilterService $vehicleFilterService): JsonResponse 
    { 
        return $this->json(['success' => true, 'filter' => $vehicleFilterService->initFilter()]); 
    } 
 
    public function initVehicleFilterUrl(VehicleFilterService $vehicleFilterService): JsonResponse 
    { 
        return $this->json(['success' => true, 'filterUrl' => $vehicleFilterService->getUrl()]); 
    } 
 
    public function vehicleColor(): JsonResponse 
    { 
        $vehicleImageColor = $this->modelCatalog->getVehicleImageColor(); 
        return $this->json([ 
            'success' => true, 
            'image' => $vehicleImageColor, 
        ]); 
    } 
 
    public function saveCallback(Request $request, EntityManagerInterface $em, FormManager $formManager) 
    { 
        $dealer = $em->getRepository(Dealer::class)->findOneBy(['id' => $request->request->get('call_order')['dealer']]); 
        return $formManager->saveCallbackForm($request, $dealer); 
    } 
 
 
    //search 
 
    /** 
     * @param Request $request 
     * @return JsonResponse 
     */ 
    public function buildSearchUrl(Request $request) 
    { 
        $params = $request->request->all(); 
        $type = $params['type']; 
        $state = $params['state']; 
        $hasCredit = filter_var($params['credit'] ?? false, FILTER_VALIDATE_BOOLEAN); 
        $brand = $params['brand'] ?? null; 
        $model = $params['model'] ?? null; 
        $isAjax = $params['isAjax'] ?? null; 
 
        if (is_array($brand) && count($brand) == 1) { 
            $brand = array_keys($brand)[0]; 
        } 
        if (is_array($model) && count($model) == 1) { 
            $model = array_keys($model)[0]; 
        } 
 
        $baseRouteParams = [ 
            'type' => $type, 
            'state' => $state, 
        ]; 
 
        if($hasCredit){ 
            $baseRouteParams['credit'] = true; 
        } 
 
        $getParams = []; 
        foreach ($params as $key => $row) { 
            if (!in_array($key, ['type', 'state', 'brand', 'model', 'dynamic']) && $row) { 
                $getParams[$key] = $row; 
            } 
        } 
 
        if (is_array($brand)) { 
            $getParams['m-brand'] = $brand; 
            $brand = null; 
        } else if ($brand) { 
            $getParams['m-brand'] = [$brand => true]; 
        } 
        if (is_array($model)) { 
            $getParams['m-model'] = $model; 
            $model = null; 
        } else if ($model) { 
            $getParams['m-model'] = [$model => true]; 
            $model = null; 
        } 
 
        $dynamic = []; 
        if (isset($params['dynamic'])) { 
            foreach ($params['dynamic'] as $id => $values) { 
                if (array_key_exists('from', $values) || array_key_exists('to', $values)) { 
                    $dynamic[$id] = $values; 
                } else { 
                    foreach ($values as $url => $v) { 
                        if ($v != 'false') { 
                            $dynamic[$id][$url] = 1; 
                        } 
                    } 
                } 
            } 
        } 
 
        $catalogCharacteristic = array_flip($this->modelCatalog->getCatalogCharacteristicsId()); 
 
        if (!$brand && !$model && (!count($dynamic) || empty(array_intersect_key($dynamic, $catalogCharacteristic)))) { 
            $url = $this->router 
                ->generate( 
                    'portal_filter_catalog', 
                    array_merge($baseRouteParams, $getParams, ['dynamic' => $dynamic, 'state' => $state, 'type' => $type]) 
                ); 
 
            $apiUrl = $this->router 
                ->generate( 
                    'portal_filter_catalog_api', 
                    array_merge($baseRouteParams, $getParams, ['dynamic' => $dynamic, 'state' => $state, 'type' => $type]) 
                ); 
            return $this->json(['url' => $url, 'apiUrl' => $apiUrl]); 
        } 
 
        if (!$brand && !$model && count($dynamic)) { 
            $dId = key($dynamic); 
            $value = key($dynamic[$dId]); 
            if (!count($dynamic[$dId])) { 
                unset($dynamic[$dId]); 
            } 
            $baseRouteParams['param'] = $dId; 
            $baseRouteParams['value'] = $value; 
            $url = $this->router 
                ->generate( 
                    'portal_filter_catalog', 
                    array_merge($baseRouteParams, $getParams, ['dynamic' => $dynamic, 'state' => $state, 'type' => $type]) 
                ); 
 
            $apiUrl = $this->router 
                ->generate( 
                    'portal_filter_catalog_api', 
                    array_merge($baseRouteParams, $getParams, ['dynamic' => $dynamic, 'state' => $state, 'type' => $type]) 
                ); 
 
            return $this->json(['url' => $url, 'apiUrl' => $apiUrl]); 
        } 
 
        if ($model) { 
            $baseRouteParams['model'] = $model; 
            $baseRouteParams['brand'] = $brand; 
            $url = $this->router 
                ->generate( 
                    'portal_filter_catalog', 
                    array_merge($baseRouteParams, $getParams, ['dynamic' => $dynamic, 'state' => $state, 'type' => $type]) 
                ); 
 
            $apiUrl = $this->router 
                ->generate( 
                    'portal_filter_catalog_api', 
                    array_merge($baseRouteParams, $getParams, ['dynamic' => $dynamic, 'state' => $state, 'type' => $type]) 
                ); 
            return $this->json(['url' => $url, 'apiUrl' => $apiUrl]); 
        } 
 
        if ($brand) { 
            $baseRouteParams['brand'] = $brand; 
            $url = $this->router 
                ->generate( 
                    'portal_filter_catalog', 
                    array_merge($baseRouteParams, $getParams, ['dynamic' => $dynamic, 'state' => $state, 'type' => $type]) 
                ); 
 
            $apiUrl = $this->router 
                ->generate( 
                    'portal_filter_catalog_api', 
                    array_merge($baseRouteParams, $getParams, ['dynamic' => $dynamic, 'state' => $state, 'type' => $type]) 
                ); 
            return $this->json(['url' => $url, 'apiUrl' => $apiUrl]); 
        } 
    } 
 
    public function catalogSearch(Request $request, EntityManagerInterface $em) 
    { 
        $searchParams = $request->query->all(); 
        $routeParams = $request->attributes->get('_route_params'); 
        $cookies = $request->cookies->get('compare'); 
        $findVehicles = $this->modelCatalog->findByParams($searchParams, $searchParams, self::PRE_PAGES); 
        if(!$findVehicles['data']){ 
            $findVehicles = $this->modelCatalog->noFindVehicleByParams($searchParams, $searchParams, self::PRE_PAGES); 
        } 
 
        $vehicles = $this->modelCatalog->getVehicleByCatalog($this->getUser(), $findVehicles['data'], $searchParams, $cookies); 
        $pagination = $this->modelPagination->initPagination($findVehicles['count'], self::PRE_PAGES, 5); 
        $value = null; 
        $model = ''; 
        $brand = ''; 
        $vehicleTopViews = []; 
        $type = $request->get('type'); 
        $state = $request->get('state'); 
        $hasCredit = filter_var($request->get('credit') ?? false, FILTER_VALIDATE_BOOLEAN); 
 
        if ($request->get('m-brand')) { 
            $brand = array_key_first($request->get('m-brand')); 
        } 
        if ($request->get('m-model')) { 
            $model = array_key_first($request->get('m-model')); 
        } 
 
        if (isset($searchParams['dynamic'])) { 
            $param = array_key_first($searchParams['dynamic']); 
            if (isset($searchParams['dynamic'][$param])) { 
                $value = array_key_first($searchParams['dynamic'][$param]); 
            } 
        } 
 
        if ($brand && $brand === 'all') { 
            throw new NotFoundHttpException(); 
        } 
 
        $findModelUrl = (isset($searchParams['m-model'])) ? key($searchParams['m-model']) : $request->get('model'); 
        $param = $request->get('param'); 
        $valueParam = $request->get('value'); 
 
        $typeData = VehicleType::getTypeDataByUrl($type); 
        if (!$typeData) { 
            throw new NotFoundHttpException(); 
        } 
        $vehicleTypeId = $typeData['id']; 
 
        $service = $this->catalogService; 
        $filters = $service->getFilters($searchParams, $request->getLocale(), $state, $vehicleTypeId, $brand, $model, $param, $valueParam, $routeParams); 
 
        $brandEm = $em->getRepository(Brand::class)->getBrandByUrl($brand); 
        $modelEm = $em->getRepository(Model::class)->findOneByUrl($findModelUrl, $brandEm); 
 
        $catalogNav = $this->modelCatalog->getCatalogNavByGetParams($type, $state, $hasCredit, $brand, $searchParams, $valueParam); 
 
 
        if ($brandEm) { 
            if (!$modelEm) { 
                $vehicleTopViews = $this->modelCatalog->getVehicleTopViews(5, $brandEm); 
            } else { 
                $vehicleTopViews = $this->modelCatalog->getVehicleItemTopViews(5, $brandEm, $modelEm); 
            } 
        } 
 
        $dealers = $em->getRepository(Dealer::class)->getDealerByBrandUrl($brandEm); 
 
        if (!$brand && ($searchParams['type'] == 'truck' || $searchParams['type'] == 'bus')) { 
            $brandSId = []; 
            foreach ($vehicles as $vehicle) { 
                $brandSId[] = $vehicle['dealer']; 
            } 
            $dealers = $em->getRepository(Dealer::class)->findBy(['id' => $brandSId]); 
        } 
 
        $dealers = array_filter($dealers, fn($dealer) => $dealer->getId() !== 39); 
 
        if ($model && !isset($searchParams['model'])) { 
            $searchParams['model'] = $model; 
        } 
 
        if ($brand && !isset($searchParams['brand'])) { 
            $searchParams['brand'] = $brand; 
        } 
 
        $seoLinks = $this->seoMetaTag->buildSeoLinks($searchParams, $request->getLocale()); 
 
 
        $isUsed = $state == 'used'; 
        $catalogCharacteristic = $service->catalogCharacteristic($vehicleTypeId, $isUsed); 
 
        $seoLinks = $service->seoYearsLinksFilter($searchParams, $vehicles, $searchParams, $seoLinks); 
 
        $OrderCallForm = new Forms(); 
        $OrderCallForm = $this->CoreFormFactory()->orderCallForm($OrderCallForm, $brandEm ? $brandEm->getDealer()[0] : null, 1)->createView(); 
 
        return $this->basePortalRender('@Portal/Car/catalog-search.html.twig', [ 
            'vehicles' => $vehicles, 
            'seoLinks' => [], 
            'pagination' => $pagination, 
            'filters' => $filters, 
            'catalogNav' => $catalogNav, 
            'baseParams' => $searchParams, 
            'searchParams' => $searchParams, 
            'dealers' => $dealers, 
            'vehicleTopViews' => $vehicleTopViews, 
            'count' => $findVehicles['count'], 
            'type' => $searchParams['type'], 
            'state' => $searchParams['state'], 
            'hasCredit' => $searchParams['hasCredit'] ?? false, 
            'brand' => $brand, 
            'brandEm' => $brandEm, 
            'model' => $model, 
            'modelEm' => $modelEm, 
            'param' => $param, 
            'value' => $request->get('value'), 
            'year' => ($param === 1000) ? $param : $valueParam, 
            'seoMeta' => $this->seoMetaTag->buildSeoMetaGetParams($request, $searchParams, $searchParams, $param, $value), 
            'valueParam' => $catalogCharacteristic[$param][$valueParam] ?? null, 
            'catalogBanner' => $service->getCatalogBanner($request), 
            'OrderCallForm' => $OrderCallForm ?? '', 
        ]); 
    } 
 
    public function catalogSearchApi(Request $request, EntityManagerInterface $em) 
    { 
        $searchParams = $request->query->all(); 
        $routeParams = $request->attributes->get('_route_params'); 
        $cookies = $request->cookies->get('compare'); 
        $findVehicles = $this->modelCatalog->findByParams($searchParams, $searchParams, self::PRE_PAGES); 
        if(!$findVehicles['data']){ 
            $findVehicles = $this->modelCatalog->noFindVehicleByParams($searchParams, $searchParams, self::PRE_PAGES); 
        } 
 
        $vehicles = $this->modelCatalog->getVehicleByCatalog($this->getUser(), $findVehicles['data'], $searchParams, $cookies); 
        $pagination = $this->modelPagination->initPagination($findVehicles['count'], self::PRE_PAGES, 5); 
        $value = null; 
        $model = ''; 
        $brand = ''; 
        $vehicleTopViews = []; 
        $type = $request->get('type'); 
        $state = $request->get('state'); 
        $hasCredit = filter_var($request->get('credit') ?? false, FILTER_VALIDATE_BOOLEAN); 
        if ($request->get('m-brand')) { 
            $brand = array_key_first($request->get('m-brand')); 
        } 
        if ($request->get('m-model')) { 
            $model = array_key_first($request->get('m-model')); 
        } 
 
        if (isset($searchParams['dynamic'])) { 
            $param = array_key_first($searchParams['dynamic']); 
            if (isset($searchParams['dynamic'][$param])) { 
                $value = array_key_first($searchParams['dynamic'][$param]); 
            } 
        } 
 
        if ($brand && $brand === 'all') { 
            throw new NotFoundHttpException(); 
        } 
 
        $findModelUrl = (isset($searchParams['m-model'])) ? key($searchParams['m-model']) : $request->get('model'); 
        $param = $request->get('param'); 
        $valueParam = $request->get('value'); 
 
        $typeData = VehicleType::getTypeDataByUrl($type); 
        if (!$typeData) { 
            throw new NotFoundHttpException(); 
        } 
        $vehicleTypeId = $typeData['id']; 
 
        $service = $this->catalogService; 
        $filters = $service->getFilters($searchParams, $request->getLocale(), $state, $vehicleTypeId, $brand, $model, $param, $valueParam, $routeParams); 
 
        $brandEm = $em->getRepository(Brand::class)->getBrandByUrl($brand); 
        $modelEm = $em->getRepository(Model::class)->findOneByUrl($findModelUrl, $brandEm); 
 
        if ($brandEm) { 
            if (!$modelEm) { 
                $vehicleTopViews = $this->modelCatalog->getVehicleTopViews(5, $brandEm); 
            } else { 
                $vehicleTopViews = $this->modelCatalog->getVehicleItemTopViews(5, $brandEm, $modelEm); 
            } 
        } 
 
        $dealers = $em->getRepository(Dealer::class)->getDealerByBrandUrl($brandEm); 
 
        if (!$brand && ($searchParams['type'] == 'truck' || $searchParams['type'] == 'bus')) { 
            $brandSId = []; 
            foreach ($vehicles as $vehicle) { 
                $brandSId[] = $vehicle['dealer']; 
            } 
            $dealers = $em->getRepository(Dealer::class)->findBy(['id' => $brandSId]); 
        } 
 
        if ($model && !isset($searchParams['model'])) { 
            $searchParams['model'] = $model; 
        } 
 
        if ($brand && !isset($searchParams['brand'])) { 
            $searchParams['brand'] = $brand; 
        } 
 
        if ($request->isXmlHttpRequest()) { 
            return $this->json([ 
                'vehicles' => $service->getAjaxResult($vehicles, $request->getLocale()), 
                'pagination' => $pagination, 
                'hasCredit' => $searchParams['hasCredit'] ?? false, 
                'count' => $findVehicles['count'], 
                'searchFilters' => $filters, 
                'seoLinks' => [] 
            ]); 
        } 
 
        return false; 
    } 
}