- <?php
- namespace DcSiteBundle\Controller\Opel;
- use CoreBundle\Component\CoreFormFactory;
- use CoreBundle\Component\FormManager;
- use CoreBundle\Entity\Forms;
- use CoreBundle\Entity\Vehicles\Category;
- use CoreBundle\Entity\Vehicles\Vehicle;
- 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\CarInStockService;
- use DcSiteBundle\Services\CatalogService;
- use DcSiteBundle\Services\HistoryManager;
- use DcSiteBundle\Services\ModelRange\Pages\PagesService;
- use DcSiteBundle\Services\UsedVehicleService;
- use DcSiteBundle\Services\VehicleService;
- use DcSiteBundle\Services\VehicleViewService;
- 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;
-     private CatalogService $catalogService;
-     public function __construct(CarInStockService $carInStockService, UsedVehicleService $usedVehicleService, CatalogService $catalogService, 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;
-         $this->catalogService = $catalogService;
-         parent::__construct($coreFormFactory, $seoMetaTag, $requestStack, $router, $formManager, $em, $apiServer1C, $session, $filesystem, $mediaExtensionVidi, $vehicleRepository, $vehicleFactory, $twig);
-     }
-     public function car(Request $request, VehicleService $vehicleService, 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);
-         $vehicleFaqs = $vehicleService->getVehicleFaqs($vehicleEm);
-         $carInStock = $this->carInStockService->getCarInStockByModel($this->getDealer(), $request->getLocale(), $vehicleEm->getModel(), 4);
-         $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->baseOpelRender('@DcSite/Opel/Car/car-card.html.twig', [
-             'model' => $vehicle,
-             'vehiclePrice' => $vehiclePrice,
-             'vehicleEquipment' => $vehicleEquipment,
-             'vehicleColor' => $vehicleColor,
-             'carInStock' => $carInStock,
-             'faqs' => $vehicleFaqs,
-             '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(),
-             'structuredData' => $this->getCarPageStructuredData($request, $vehicle),
-             'leasingCalculatorForm' => $this->CoreFormFactory()->leasingForm()->createView(),
-             'callMeForm' => $form->createView()
-         ]);
-     }
-     public function carConfiguraion(VehicleService $vehicleService, $car): ?Response
-     {
-         $Dealer = $this->getDealer();
-         $Vehicle = $this->vehicleFactory->createByUrl($car, $Dealer);
-         if (!$Vehicle) {
-             throw new NotFoundHttpException();
-         }
-         $vehicleEm = $Vehicle->getVehicleEntity();
-         $vehicleCharacteristic = $vehicleService->getVehicleCharacteristic($vehicleEm);
-         return $this->baseOpelRender('@DcSite/Opel/Car/configuration.html.twig', [
-             'model' => $Vehicle,
-             'vehicleCharacteristic' => $vehicleCharacteristic,
-         ]);
-     }
-     public function list(Request $request, PagesService $pagesService): ?Response
-     {
-         $catalog = $this->catalogService->getCategoryVehicles($this->getDealer());
-         $catalogVehicle = $this->catalogService->getCatalogVehicleByCategory($this->getDealer());
-         return $this->baseOpelRender('@DcSite/Opel/Car/catalog.html.twig', [
-             'category' => null,
-             'catalog' => $catalog,
-             'catalogVehicle' => $catalogVehicle,
-             '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->baseOpelRender('@DcSite/Opel/Car/catalog-page.html.twig', ['page' => $page]);
-     }
-     public function category(Request $request, PagesService $pagesService, $category): ?Response
-     {
-         $vehicleCategory = $this->em->getRepository(Category::class)->findOneBy(['url' => $category]);
-         if (!$vehicleCategory) {
-             throw new NotFoundHttpException();
-         }
-         $catalog = $this->catalogService->getCategoryVehicles($this->getDealer());
-         $catalogVehicle = $this->catalogService->getCatalogVehicleByCategory($this->getDealer(), $category);
-         $category = $this->catalogService->getCatalogCategory($catalog, $category);
-         return $this->baseOpelRender('@DcSite/Opel/Car/catalog.html.twig', [
-             'category' => $category,
-             'catalog' => $catalog,
-             'catalogVehicle' => $catalogVehicle,
-             'catalogModelRangePages' => $pagesService
-                 ->setLang($request->getLocale())
-                 ->getPages($this->getDealer())
-         ]);
-     }
-     public function commercialList(): Response
-     {
-         $models = $this->vehicleRepository->getNewByDealer($this->getDealer());
-         $result = [];
-         /** @var Vehicle $model */
-         foreach ($models as $model) {
-             if ($model->getCategory()->getId() != 4) {
-                 continue;
-             }
-             $model = $this->vehicleFactory->createByEntity($model);
-             if (!$model) {
-                 continue;
-             }
-             array_push($result, [
-                 'title' => $model->getModelName(),
-                 'isNew' => $model->isNew(),
-                 'isPreOrder' => $model->isPreOrder(),
-                 'image' => $model->getPreview(),
-                 'price' => $model->price(),
-                 'url' => $model->getUrl()
-             ]);
-         }
-         return $this->baseOpelRender('@DcSite/Opel/Car/comercial-list.html.twig', [
-             'models' => $result
-         ]);
-     }
-     public function carInStock(Request $request): ?Response
-     {
-         $vehicles = $this->carInStockService->getCarInStockByDealer(
-             $this->getDealer(),
-             null,
-             $request->getLocale()
-         );
-         $this->carInStockService->sortVehicleByDealer($vehicles, $this->getDealer()->getUniqueId());
-         return $this->baseOpelRender('@DcSite/Opel/Car/car-in-stocks.html.twig', ['vehicles' => $vehicles]);
-     }
-     public function carInStockSingle(Request $request, InStockVehicle $inStockVehicleFactory, $url): ?Response
-     {
-         $car = $inStockVehicleFactory->createByUrl($url, $this->getDealer());
-         if (!$car) {
-             throw new NotFoundHttpException();
-         }
-         $options = $car->getOptions($request->getLocale());
-         $form = $this->CoreFormFactory()
-             ->callMeForm(new Forms(), true);
-         $form->get('dealer')->setData($this->getDealer());
-         return $this->baseOpelRender('@DcSite/Opel/Car/car-in-stock-card.html.twig', [
-             'model' => $car,
-             'buyInStockForm' => $this->CoreFormFactory()->buyInStockForm(null, $car->getInStockEntity())->createView(),
-             'options' => $options,
-             'structuredCarData' => $this->getCarStructuredDataCarInStock($request, $car),
-             'callMeForm' => $form->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->baseOpelRender('@DcSite/Opel/Car/archive.html.twig', ['cars' => $result]);
-     }
-     public function usedCarCatalog(Request $request): ?Response
-     {
-         $vehicles = $this->usedVehicleService->getUsedVehicles(
-             $this->getDealer(),
-             DealerPathEnum::OPEL,
-             $request->getLocale()
-         );
-         return $this->baseOpelRender('@DcSite/Opel/Car/used-car-catalog.html.twig', ['vehicles' => $vehicles]);
-     }
-     public function secondhandSingle(Request $request, CreditModel $creditModel, VehicleViewService $vehicleViewService, $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('opel_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) {
-             $vehicleItemHasGallery = $this->vehicleFactory->createByEntity($vehicleItem->getVariation()->getVehicle())->getGallery();
-             $vehicleItemGallery = null;
-             if ($vehicleItemHasGallery) {
-                 $vehicleItemGallery = $vehicleItemHasGallery->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('opel_used_car_single', ['url' => $vehicle->getUrl()]),
-                 'gallery' => $vehicleItemGalleryImages
-             ];
-         }
-         $options = $vehicle->getOptionsArray($request->getLocale());
-         return $this->baseOpelRender('@DcSite/Opel/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)
-         ]);
-     }
- }
-