<?php 
 
namespace DcSiteBundle\Controller\Jeep; 
 
use BmpGatewayBundle\Entity\VehicleTestDrive; 
use CoreBundle\Component\CoreFormFactory; 
use CoreBundle\Component\FormManager; 
use CoreBundle\Entity\Forms; 
use CoreBundle\Entity\Vehicles\InStock; 
use CoreBundle\Entity\Vehicles\VehicleItem; 
use CoreBundle\Factory\InStockVehicle; 
use CoreBundle\Factory\Vehicle as VehicleFactory; 
use CoreBundle\Model\Api\OnlineService\ApiServer1C; 
use CoreBundle\Model\Vehicles\Repository; 
use CoreBundle\Services\MediaExtensionVidi; 
use DcSiteBundle\Enum\DealerPathEnum; 
use DcSiteBundle\Model\CreditModel; 
use DcSiteBundle\Services\AccessoryService; 
use DcSiteBundle\Services\CarInStockService; 
use DcSiteBundle\Services\HistoryManager; 
use DcSiteBundle\Services\ModelRange\Pages\PagesService; 
use DcSiteBundle\Services\UsedVehicleService; 
use DcSiteBundle\Services\VehicleService; 
use Doctrine\ORM\EntityManagerInterface; 
use PortalBundle\Model\SeoMetaTag; 
use Symfony\Component\Filesystem\Filesystem; 
use Symfony\Component\HttpFoundation\Request; 
use Symfony\Component\HttpFoundation\RequestStack; 
use Symfony\Component\HttpFoundation\Response; 
use Symfony\Component\HttpFoundation\Session\SessionInterface; 
use Symfony\Component\HttpKernel\Exception\NotFoundHttpException; 
use Symfony\Component\Routing\RouterInterface; 
use Twig\Environment; 
 
class CarController extends BaseController 
{ 
    private CarInStockService $carInStockService; 
    private UsedVehicleService $usedVehicleService; 
 
    public function __construct(CoreFormFactory $coreFormFactory, SeoMetaTag $seoMetaTag, RequestStack $requestStack, RouterInterface $router, FormManager $formManager, EntityManagerInterface $em, ApiServer1C $apiServer1C, SessionInterface $session, Filesystem $filesystem, MediaExtensionVidi $mediaExtensionVidi, Repository $vehicleRepository, VehicleFactory $vehicleFactory, Environment $twig, CarInStockService $carInStockService, UsedVehicleService $usedVehicleService) 
    { 
        $this->carInStockService = $carInStockService; 
        $this->usedVehicleService = $usedVehicleService; 
        parent::__construct($coreFormFactory, $seoMetaTag, $requestStack, $router, $formManager, $em, $apiServer1C, $session, $filesystem, $mediaExtensionVidi, $vehicleRepository, $vehicleFactory, $twig); 
    } 
 
    public function list(Request $request, PagesService $pagesService): ?Response 
    { 
        $vehiclesRepo = $this->vehicleRepository->getNewByDealer($this->getDealer(), [], true); 
        $vehicles = $this->vehicleFactory->createByEntities($vehiclesRepo); 
 
        return $this->baseJeepRender('@DcSite/Jeep/Car/car-catalog.html.twig', [ 
            'vehicles' => $vehicles, 
            'catalogModelRangePages' => $pagesService->setLang($request->getLocale())->getPages($this->getDealer()) 
        ]); 
    } 
 
    public function listPage(Request $request, PagesService $pagesService, string $url): ?Response 
    { 
        $page = $pagesService->setLang($request->getLocale())->getPage($this->getDealer(), $url); 
 
        if (empty($page)) { 
            throw new NotFoundHttpException(); 
        } 
 
        return $this->baseJeepRender('@DcSite/Jeep/Car/car-catalog-page.html.twig', ['page' => $page]); 
    } 
 
    public function car(Request        $request, VehicleService $vehicleService, CreditModel $creditModel, AccessoryService $accessoryService, 
                        HistoryManager $historyManager, $car): ?Response 
    { 
        $dealer = $this->getDealer(); 
        $vehicle = $this->vehicleFactory->createByUrl($car, $dealer); 
        if (!$vehicle) { 
            throw new NotFoundHttpException(); 
        } 
 
        $vehicleEm = $vehicle->getVehicleEntity(); 
        $vehiclePrice = $vehicleService->getVehiclePrice($vehicleEm); 
        $vehicleEquipment = $vehicleService->getVehicleEquipment($vehicleEm); 
        $vehicleColor = $vehicleService->getVehicleColor($vehicleEm); 
        $vehicleFile = $vehicleService->getVehicleFile($vehicleEm); 
        $vehicleAccessory = $accessoryService->getAccessoriesByDealerVehicleType($dealer); 
        $vehicleFaqs = $vehicleService->getVehicleFaqs($vehicleEm); 
        $carInStock = $this->carInStockService->getCarInStockByModel($this->getDealer(), $request->getLocale(), $vehicleEm->getModel(), 4); 
        $carUsed = $this->usedVehicleService->getUsedVehicles($this->getDealer(), DealerPathEnum::JEEP, $request->getLocale(), null, 4); 
 
        $creditPayment = $creditModel->getMinPayment($vehicle); 
        $variationId = (isset($vehiclePrice['variations'][0])) ? $vehiclePrice['variations'][0]['id'] : null; 
        $historyManager->setUserCarHistory($this->getUser(), $vehicleEm); 
 
        $TdForm = new Forms(); 
        $TdForm->setVehicle($vehicle->getVehicleEntity()); 
 
        $form = $this->CoreFormFactory() 
            ->callMeForm(new Forms(), true); 
        $form->get('dealer')->setData($this->getDealer()); 
 
        return $this->baseJeepRender('@DcSite/Jeep/Car/car-card-single.html.twig', [ 
            'model' => $vehicle, 
            'variationId' => $variationId, 
            'vehiclePrice' => $vehiclePrice, 
            'vehicleEquipment' => $vehicleEquipment, 
            'vehicleColor' => $vehicleColor, 
            'vehicleFile' => $vehicleFile, 
            'vehicleAccessory' => $vehicleAccessory, 
            'carInStock' => $carInStock, 
            'carUsed' => $carUsed, 
            'faqs' => $vehicleFaqs, 
            'creditPayment' => $creditPayment, 
            'structuredData' => $this->getCarPageStructuredData($request, $vehicle), 
            'buyForm' => $this->CoreFormFactory()->buyForm(null, $vehicle->getVehicleEntity(), null, null, false, false, $vehicle->getPrice())->createView(), 
            'buyPartsForm' => $this->CoreFormFactory()->buyPartsForm($this->getDealer())->createView(), 
            'creditForm' => $this->CoreFormFactory()->creditForm($this->getDealer())->createView(), 
            'leasingCalculatorForm' => $this->CoreFormFactory()->leasingForm()->createView(), 
            'orderCascoForm' => $this->CoreFormFactory()->orderCascoForm()->createView(), 
            'tradeInFrom' => $this->CoreFormFactory()->tradeInFrom($this->getDealer())->createView(), 
            'testDrivePageForm' => $this->CoreFormFactory()->testDriveForm($this->getDealer(), $TdForm)->createView(), 
            'hasTestDrive' => $this->em 
                ->getRepository(VehicleTestDrive::class) 
                ->hasTestDrive($dealer, $vehicle->getModel()), 
            'callMeForm' => $form->createView() 
        ]); 
    } 
 
    public function carInStockCatalog(Request $request): ?Response 
    { 
        $vehicles = $this->carInStockService->getCarInStockByDealer($this->getDealer(), null, $request->getLocale()); 
 
        $this->carInStockService->sortVehicleByDealer($vehicles, $this->getDealer()->getUniqueId()); 
 
        return $this->baseJeepRender('@DcSite/Jeep/Car/car-in-stock-catalog.html.twig', [ 
            'vehicles' => $vehicles 
        ]); 
    } 
 
    public function carInStockSingle(Request $request, InStockVehicle $inStockVehicle, CreditModel $creditModel, $url) 
    { 
        $model = $inStockVehicle->createByUrl($url, $this->getDealer()); 
        if (!$model) { 
            $model = $inStockVehicle->createByUrl($url, $this->getDealer(), false); 
            if ($model) { 
                return $this->redirectToRoute('jeep_car', ['car' => $model->getVehicle()->getUrl()], 301); 
            } else { 
                return $this->redirectToRoute('jeep_car_in_stock_catalog', [], 301); 
            } 
        } 
 
        $vehicleModel = $this->vehicleFactory->createByEntity($model->getVehicle()); 
        $creditPayment = $creditModel->getMinPayment($vehicleModel); 
 
        $options = $model->getOptions($request->getLocale()); 
 
        $TdForm = new Forms(); 
        $TdForm->setVehicle($model->getVehicle()); 
        $form = $this->CoreFormFactory() 
            ->callMeForm(new Forms(), true); 
        $form->get('dealer')->setData($this->getDealer()); 
 
        return $this->baseJeepRender('@DcSite/Jeep/Car/car-in-stock-single.html.twig', [ 
            'model' => $model, 
            'vehicleItemPrice' => $this->em->getRepository(VehicleItem::class)->findBy(['id' => $model->getVehicleItemId()])[0]->getPrice(), 
            'vehicleActionPrice' => $this->em->getRepository(InStock::class)->findBy(['id' => $model->getId()])[0]->getActionPrice(), 
            'vehicleModel' => $vehicleModel, 
            'creditPayment' => $creditPayment, 
            'characterisatics' => $model->getCharacterisaticsByGroup($request->getLocale()), 
            'options' => $options, 
            'testDriveForm' => $this->CoreFormFactory()->testDriveForm($this->getDealer())->createView(), 
            'creditForm' => $this->CoreFormFactory()->creditForm($this->getDealer())->createView(), 
            'leasingCalculatorForm' => $this->CoreFormFactory()->leasingForm()->createView(), 
            'tradeInFrom' => $this->CoreFormFactory()->tradeInFrom($this->getDealer())->createView(), 
            'testDrivePageForm' => $this->CoreFormFactory()->testDriveForm($this->getDealer(), $TdForm)->createView(), 
            'buyInStockForm' => $this->CoreFormFactory()->buyInStockForm(null, $model->getInStockEntity())->createView(), 
            'structuredCarData' => $this->getCarStructuredDataCarInStock($request, $model), 
            'callMeForm' => $form->createView() 
        ]); 
    } 
 
    public function usedCarCatalog(Request $request): ?Response 
    { 
        $vehicles = $this->usedVehicleService->getUsedVehicles($this->getDealer(), DealerPathEnum::JEEP, $request->getLocale()); 
        return $this->baseJeepRender('@DcSite/Jeep/Car/used-car-catalog.html.twig', [ 
            'vehicles' => $vehicles 
        ]); 
    } 
 
    public function usedCarSingle(Request $request, CreditModel $creditModel, $url): ?Response 
    { 
        $vehicle = $this->vehicleFactory->createUsedByUrl($url); 
        if (!$vehicle) { 
            throw new NotFoundHttpException(); 
        } 
 
        $creditPayment = $creditModel->getMinPayment($vehicle); 
        $options = $vehicle->getOptions($request->getLocale()); 
 
        return $this->baseJeepRender('@DcSite/Jeep/Car/used-car-single.html.twig', [ 
            'vehicle' => $vehicle, 
            'characterisatics' => $vehicle->getCharacterisaticsWithGroup($request->getLocale()), 
            'options' => $options, 
            'creditPayment' => $creditPayment, 
            'buyForm' => $this->CoreFormFactory()->buyForm(null, $vehicle->getVehicleEntity(), null, null, true, false, $vehicle->getPrice())->createView(), 
            'structuredCarData' => $this->getCarStructuredDataCarUsed($request, $vehicle) 
        ]); 
    } 
 
    public function technicalCharacteristics(VehicleService $vehicleService, $model): ?Response 
    { 
        $Dealer = $this->getDealer(); 
        $Vehicle = $this->vehicleFactory->createByUrl($model, $Dealer); 
        if (!$Vehicle) { 
            throw new NotFoundHttpException(); 
        } 
 
        $technicalCharacteristic = $vehicleService->getVehicleTechnicalCharacteristic($Vehicle->getVehicleEntity()); 
 
        return $this->baseJeepRender('@DcSite/Jeep/Car/technical-characteristics.html.twig', [ 
            'model' => $Vehicle, 
            'technicalCharacteristic' => $technicalCharacteristic, 
        ]); 
    } 
}