- <?php
- namespace DcSiteBundle\Controller\Subaru;
- use CoreBundle\Component\CoreFormFactory;
- use CoreBundle\Component\FormManager;
- use CoreBundle\Entity\Forms;
- use CoreBundle\Entity\Vehicles\Vehicle;
- use CoreBundle\Entity\Vehicles\VehicleFile;
- 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 DateTime;
- 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\Subaru\VehicleService;
- use DcSiteBundle\Services\UsedVehicleService;
- use DcSiteBundle\Services\VehicleViewService;
- use Doctrine\ORM\EntityManagerInterface;
- use InsuranceBundle\Model\Program;
- 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 Symfony\Contracts\Translation\TranslatorInterface;
- use Twig\Environment;
- class CarController extends MainController
- {
-     private CarInStockService $carInStockService;
-     private UsedVehicleService $usedVehicleService;
-     public function __construct(CarInStockService $carInStockService, UsedVehicleService $usedVehicleService, 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)
-     {
-         $this->carInStockService = $carInStockService;
-         $this->usedVehicleService = $usedVehicleService;
-         parent::__construct($coreFormFactory, $seoMetaTag, $requestStack, $router, $formManager, $em, $apiServer1C, $session, $filesystem, $mediaExtensionVidi, $vehicleRepository, $vehicleFactory, $twig);
-     }
-     public function car(Request                               $request, $car, VehicleService $vehicleSubaruService, AccessoryService $accessoryService,
-                         \DcSiteBundle\Services\VehicleService $vehicleService, HistoryManager $historyManager): Response
-     {
-         $Dealer = $this->getDealer();
-         $vehicle = $this->vehicleFactory->createByUrl($car, $Dealer);
-         if (!$vehicle) {
-             throw new NotFoundHttpException();
-         }
-         $VehicleEm = $vehicle->getVehicleEntity();
-         $vehicleColor = $vehicleService->getVehicleColor($VehicleEm);
-         $carInStock = $this->carInStockService->getCarInStockByModelWithPriority($this->getDealer(), $request->getLocale(), $VehicleEm->getModel(), 4);
-         $vehicleFaqs = $vehicleService->getVehicleFaqs($VehicleEm);
-         $vehicleAccessory = $accessoryService->getAccessoriesByDealerVehicleType($Dealer);
-         $historyManager->setUserCarHistory($this->getUser(), $vehicle->getVehicleEntity());
-         $TdForm = new Forms();
-         $TdForm->setVehicle($vehicle->getVehicleEntity());
-         $form = $this->CoreFormFactory()
-             ->callMeForm(new Forms(), true);
-         $form->get('dealer')->setData($this->getDealer());
-         return $this->baseSubaruRender('@DcSite/Subaru/Car/car-card.html.twig', [
-             'model' => $vehicle,
-             'vehicleColor' => $vehicleColor,
-             'carInStock' => $carInStock,
-             'faqs' => $vehicleFaqs,
-             'vehicleAccessory' => $vehicleAccessory,
-             'buyForm' => $this->CoreFormFactory()->buyForm(null, $vehicle->getVehicleEntity(), null, null, false, false, $vehicle->getPrice())->createView(),
-             'buyPartsForm' => $this->CoreFormFactory()->buyPartsForm($this->getDealer())->createView(),
-             'testDrivePageForm' => $this->CoreFormFactory()->testDriveForm($this->getDealer(), $TdForm)->createView(),
-             'cars' => $vehicleSubaruService->getVehiclesForHeader($this->getDealer(), $request),
-             'structuredData' => $this->getCarPageStructuredData($request, $vehicle),
-             'callMeForm' => $form->createView()
-         ]);
-     }
-     public function carConfiguraion(\DcSiteBundle\Services\VehicleService $vehicleService, $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);
-         return $this->baseSubaruRender('@DcSite/Subaru/Car/configuration.html.twig', [
-             'model' => $Vehicle,
-             'vehiclePrice' => $vehiclePrice,
-             'vehicleEquipment' => $vehicleEquipment,
-         ]);
-     }
-     public function priceList(Request $request): ?Response
-     {
-         $vehicles = $this->vehicleRepository->getNewByDealer($this->getDealer());
-         $result = [];
-         /** @var Vehicle $car */
-         foreach ($vehicles as $car) {
-             $vehicleId = $car->getId();
-             $files = $car->getFiles();
-             if (!$files->count()) {
-                 continue;
-             }
-             $item = [
-                 'car' => $car,
-                 'files' => [],
-             ];
-             /** @var VehicleFile $file */
-             foreach ($files as $file) {
-                 $item['files'][] = [
-                     'title' => $file->getTitle($request->getLocale()),
-                     'href' => $this->router->generate('base_download_file', ['id' => $file->getId()])
-                 ];
-             }
-             $result[$vehicleId] = $item;
-             $position[$vehicleId] = $car->getPosition();
-         }
-         array_multisort($position, SORT_ASC, $result);
-         return $this->baseSubaruRender('@DcSite/Subaru/Car/price-list-and-catalog.html.twig', ['cars' => $result]);
-     }
-     public function modelLineup(Request $request, PagesService $pagesService): ?Response
-     {
-         $cars = $this->vehicleRepository->getNewByDealer($this->getDealer());
-         $result = [];
-         foreach ($cars as $car) {
-             $result[] = $this->vehicleFactory->createByEntity($car);
-         }
-         return $this->baseSubaruRender('@DcSite/Subaru/Car/model-lineup.html.twig', [
-             'cars' => $result,
-             '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->baseSubaruRender('@DcSite/Subaru/Car/catalog-page.html.twig', ['page' => $page]);
-     }
-     public function configurator(Request $request, TranslatorInterface $translator): ?Response
-     {
-         $url = $request->get('url');
-         $Vehicle = false;
-         if ($url != 'start') {
-             $Vehicle = $this->vehicleFactory->createByUrl($url, $this->getDealer());
-             if (!$Vehicle) {
-                 throw new NotFoundHttpException();
-             }
-         }
-         $hash = $request->query->get('hash');
-         $h1Tag = $Vehicle ? $translator->trans('base.seo.configurator.h1_car', ['%model%' => $Vehicle->getModel()->getTitle()], 'dc_toyota') : $translator->trans('base.seo.configurator.h1', [], 'dc_toyota');
-         return $this->baseSubaruRender('@DcSite/Subaru/Configurator/index.html.twig', [
-             'carId' => $Vehicle ? $Vehicle->getVehicleId() : 0,
-             'car' => $Vehicle,
-             'h1Tag' => $h1Tag,
-             'baseType' => Program::BASE_COEFFICIENT_TYPE,
-             'listType' => Program::LIST_COEFFICIENT_TYPE,
-             'optionType' => Program::OPTION_COEFFICIENT_TYPE,
-             'hash' => $hash,
-         ]);
-     }
-     public function inStockList(Request $request): ?Response
-     {
-         $vehicles = $this->carInStockService->getCarInStockByDealer(
-             $this->getDealer(),
-             null,
-             $request->getLocale()
-         );
-         $this->carInStockService->sortVehicleByDealer($vehicles, $this->getDealer()->getUniqueId());
-         return $this->baseSubaruRender('@DcSite/Subaru/Car/instock-lineup.html.twig', ['vehicles' => $vehicles]);
-     }
-     public function inStockSingle(Request $request, $url, VehicleService $vehicleService, InStockVehicle $inStockVehicle): Response
-     {
-         $car = $inStockVehicle->createByUrl($url, $this->getDealer());
-         if (!$car) {
-             $car = $inStockVehicle->createByUrl($url, $this->getDealer(), false);
-             if ($car) {
-                 return $this->redirectToRoute('subaru_card_car', ['car' => $car->getVehicle()->getUrl()], 301);
-             } else {
-                 return $this->redirectToRoute('subaru_car_stock', [], 301);
-             }
-         }
-         $options = $car->getOptions($request->getLocale());
-         $form = $this->CoreFormFactory()
-             ->callMeForm(new Forms(), true);
-         $form->get('dealer')->setData($this->getDealer());
-         return $this->baseSubaruRender('@DcSite/Subaru/Car/card-instock.html.twig', [
-             'cars' => $vehicleService->getVehiclesForHeader($this->getDealer(), $request),
-             'model' => $car,
-             'buyInStockForm' => $this->CoreFormFactory()->buyInStockForm(null, $car->getInStockEntity())->createView(),
-             'options' => $options,
-             'structuredCarData' => $this->getCarStructuredDataCarInStock($request, $car),
-             'callMeForm' => $form->createView()
-         ]);
-     }
-     public function testDrive(): ?Response
-     {
-         return $this->baseSubaruRender('@DcSite/Subaru/Car/test-drive.html.twig', [
-             'testDrivePageForm' => $this->CoreFormFactory()->testDriveForm($this->getDealer(), null, [
-                 'child' => false,
-                 'widthTime' => true
-             ])->createView()
-         ]);
-     }
-     public function archive(): ?Response
-     {
-         $vehicles = $this->vehicleRepository->getDisabled($this->getDealer());
-         $result = [];
-         foreach ($vehicles as $vehicle) {
-             $model = $this->vehicleFactory->createByEntity($vehicle);
-             if (!$model) {
-                 continue;
-             }
-             $result[] = $model;
-         }
-         return $this->baseSubaruRender('@DcSite/Subaru/Car/archive.html.twig', ['cars' => $result]);
-     }
-     public function usedCarCatalog(Request $request): ?Response
-     {
-         $vehicles = $this->usedVehicleService->getUsedVehicles(
-             $this->getDealer(),
-             DealerPathEnum::SUBARU,
-             $request->getLocale()
-         );
-         return $this->baseSubaruRender('@DcSite/Subaru/Car/used-car-catalog.html.twig', ['vehicles' => $vehicles]);
-     }
-     public function secondhandSingle(Request $request, VehicleViewService $vehicleViewService, CreditModel $creditModel, $url): ?Response
-     {
-         if (!$url) {
-             throw new NotFoundHttpException();
-         }
-         $vehicle = $this->vehicleFactory->createUsedByUrl($url);
-         if (!$vehicle) {
-             throw new NotFoundHttpException();
-         }
-         $vehicleViewService->saveViewVehicle($vehicle, $request->getClientIp(), new DateTime());
-         $viewedCars = [];
-         if (isset($_COOKIE['viewedCars'])) {
-             $viewedCars = json_decode($_COOKIE['viewedCars']);
-             if (!in_array($vehicle->getVehicleId(), $viewedCars)) {
-                 $viewedCars[] = $vehicle->getVehicleId();
-             }
-         } else {
-             setcookie('viewedCars', json_encode([$vehicle->getVehicleId()]));
-         }
-         $viewedCarEntities = $this->em->getRepository(Vehicle::class)
-             ->findBy(['id' => array_slice(array_reverse(array_diff($viewedCars, [$vehicle->getVehicleId()])), 0, 3)]);
-         $viewedCarFactories = [];
-         foreach ($viewedCarEntities as $viewedCarEntity) {
-             $viewedCarFactory = $this->vehicleFactory->createByEntity($viewedCarEntity);
-             $galleryItems = $viewedCarFactory->getGallery()
-                 ? $viewedCarFactory->getGallery()->getGalleryItems()
-                 : null;
-             $image = $galleryItems && $galleryItems->count()
-                 ? $galleryItems->first()->getMedia()
-                 : $viewedCarFactory->getPreview();
-             $viewedCarFactories[] = [
-                 'vehicle' => $viewedCarFactory,
-                 'image' => $this->mediaExtensionVidi->getPath($image, 'reference'),
-                 'link' => $this->router->generate('mazda_used_car_single', ['url' => $viewedCarFactory->getUrl()]),
-             ];
-         }
-         $galleryItems = $vehicle->getGallery()->getGalleryItems();
-         $gallery_images = [];
-         if ($galleryItems && $galleryItems->count()) {
-             foreach ($galleryItems as $galleryItem) {
-                 $gallery_images[] = $this->mediaExtensionVidi->getPath($galleryItem->getMedia(), 'reference');
-             }
-         }
-         $similarVehicles = [];
-         $similar = $this->vehicleRepository->getSimilarVehicles($vehicle, true, false, true);
-         foreach ($similar as $vehicleItem) {
-             $vehicleItemGallery = $this->vehicleFactory->createByEntity($vehicleItem->getVariation()->getVehicle())->getGallery()->getGalleryItems();
-             $vehicleItemGalleryImages = [];
-             if ($vehicleItemGallery && $vehicleItemGallery->count()) {
-                 foreach ($vehicleItemGallery as $vehicleItemGallery_item) {
-                     $vehicleItemGalleryImages[] = $this->mediaExtensionVidi->getPath($vehicleItemGallery_item->getMedia(), 'reference');
-                 }
-             }
-             $similarVehicles[] = [
-                 'vehicle' => $this->vehicleFactory->createByEntity($vehicleItem->getVariation()->getVehicle()),
-                 'creditPayment' => $creditModel->getMinPayment($this->vehicleFactory->createByEntity($vehicleItem->getVariation()->getVehicle())),
-                 'link' => $this->router->generate('mazda_used_car_single', ['url' => $vehicle->getUrl()]),
-                 'gallery' => $vehicleItemGalleryImages
-             ];
-         }
-         $options = $vehicle->getOptionsArray($request->getLocale());
-         return $this->baseSubaruRender('@DcSite/Subaru/Car/used-car-single.html.twig', [
-             'secondhand' => $vehicle,
-             'options' => $options,
-             'buyForm' => $this->CoreFormFactory()->buyForm(null, $vehicle->getVehicleEntity(), null, null, true, false, $vehicle->getPrice())->createView(),
-             'consultationForm' => $this->CoreFormFactory()->buyForm(null, $vehicle->getVehicleEntity())->createView(),
-             'gallary' => $gallery_images,
-             'creditPayment' => $creditModel->getMinPayment($vehicle),
-             'similarCars' => $similarVehicles,
-             'viewedCars' => $viewedCarFactories,
-             'structuredCarData' => $this->getCarStructuredDataCarUsed($request, $vehicle)
-         ]);
-     }
- }
-