<?php 
 
namespace AutomarketBundle\Controller; 
 
use AutomarketBundle\Services\SeoService; 
use CoreBundle\Component\CoreFormFactory; 
use CoreBundle\Entity\Post; 
use CoreBundle\Entity\Vehicles\Vehicle; 
use CoreBundle\Model\Vehicles\Repository; 
use CoreBundle\Model\Vehicles\VehicleType; 
use Doctrine\ORM\EntityManagerInterface; 
use PortalBundle\Model\SeoMetaTag; 
use Symfony\Component\HttpFoundation\RequestStack; 
use Symfony\Component\HttpFoundation\Response; 
use Symfony\Component\Routing\RouterInterface; 
use Symfony\Component\Yaml\Yaml; 
 
class SiteMapController extends BaseController 
{ 
    private SeoService $seoService; 
 
 
    public function __construct(CoreFormFactory $coreFormFactory, RequestStack $requestStack, EntityManagerInterface $em, 
                                SeoMetaTag      $seoMetaTag, SeoService $seoService) 
    { 
        parent::__construct($coreFormFactory, $requestStack, $em, $seoMetaTag); 
        $this->seoService = $seoService; 
    } 
 
    public function siteMap(RouterInterface $router, Repository $vehicleRepository, \CoreBundle\Factory\Vehicle $vehicleFactory): Response 
    { 
        $root = $this->getParameter('kernel.project_dir'); 
        $routingFile = $root . '/src/AutomarketBundle/Resources/config/routing/sitemap.yml'; 
        $routes = Yaml::parseFile($routingFile); 
        $result = []; 
 
        foreach ($routes as $rName => $route) { 
            if ( 
                in_array( 
                    $rName, 
                    [ 
                        'automarket_car', 
                        'automarket_seo_catalog', 
                        'automarket_vacancy_single', 
                        'automarket_news_single', 
                        'automarket_about_vacancy_id', 
                        'automarket_catalog_vehicle_collections', 
                        'automarket_catalog', 
                        'automarket_catalog_characteristic', 
                        'automarket_catalog_price', 
                        'automarket_catalog_brand', 
                        'automarket_catalog_brand_model', 
                        'automarket_catalog_brand_model_price', 
                        'automarket_catalog_brand_characteristic', 
                        'automarket_catalog_brand_model_characteristic', 
                        'automarket_catalog_brand_model_characteristic_price', 
                        'automarket_vehicle', 
                        'automarket_catalog_characteristic_by_body', 
                    ] 
                ) 
            ) { 
                continue; 
            } 
            $result[] = [ 
                'url' => $router->generate($rName), 
                'priority' => '0.1', 
                'changefreq' => 'yearly', 
            ]; 
        } 
 
        $this->seoService->initModelRangePage(); 
 
        foreach ($this->seoService->getVehicleDataUrl() as $item) { 
            if (array_key_exists('model', $item['parameters']) && $item['parameters']['model'] == '') { 
                continue; 
            } 
            $result[] = [ 
                'url' => $router->generate($item['name'], $item['parameters']), 
                'priority' => '0.8', 
                'changefreq' => 'daily', 
            ]; 
        } 
 
        $vehicles = $vehicleRepository->getUsedVehicles(); 
 
        /** @var Vehicle $vehicle */ 
        foreach ($vehicles as $vehicle) { 
            if (!$vehicle->getModel()->getUrl()) { 
                continue; 
            } 
 
            if (!$vehicle->getState()) { 
                continue; 
            } 
 
            $vehicle = $vehicleFactory->createByEntity($vehicle); 
 
            if (!$vehicle) { 
                continue; 
            } 
 
            $vehicleTypeData = VehicleType::getTypeDataById($vehicle->getVehicleType()); 
 
 
            $result[] = [ 
                'url' => $router->generate('automarket_vehicle', ['state' => 'used', 'type' => $vehicleTypeData['url'], 'brand' => $vehicle->getModel()->getBrand()->getUrl(), 'model' => $vehicle->getModel()->getUrl(), 'id' => $vehicle->getVehicleId()]), 
                'priority' => '0.8', 
                'changefreq' => 'daily', 
            ]; 
        } 
 
        $post = $this->em->getRepository(Post::class) 
            ->findBy(['dealer' => $this->getDealer(), 'state' => 1]); 
 
        /** @var Post $one */ 
        foreach ($post as $one) { 
            $result[] = [ 
                'url' => $router->generate('automarket_news_single', ['url' => $one->getUrl()]), 
                'priority' => '0.2', 
                'changefreq' => 'monthly', 
            ]; 
        } 
 
        $response = $this->baseAutomarketRender('@DcSite/sitemap.xml.twig', ['urls' => $result, 'route' => 'ford_sitemap']); 
        $response->headers->set('Content-Type', 'application/xml'); 
        $response->setCharset('utf-8'); 
        return $response; 
    } 
 
}