- <?php
- namespace PortalBundle\Controller;
- use CoreBundle\Component\CoreFormFactory;
- use CoreBundle\Entity\Post;
- use CoreBundle\Factory\InStockVehicle;
- use CoreBundle\Model\Leasing\LeasingClient;
- use CoreBundle\Model\Vehicles\Repository;
- use DcSiteBundle\Model\CreditModel;
- use DcSiteBundle\Services\HistoryManager;
- use DcSiteBundle\Services\VehicleViewService;
- use CoreBundle\Entity\Dealer;
- use CoreBundle\Entity\Forms;
- use CoreBundle\Entity\Vehicles\VehicleItem;
- use CoreBundle\Model\Vehicles\AbstractVehicle;
- use CoreBundle\Model\Vehicles\Vehicle;
- use CoreBundle\Model\Vehicles\VehicleType;
- use DateTime;
- use Doctrine\ORM\EntityManagerInterface;
- use Doctrine\ORM\OptimisticLockException;
- use PortalBundle\Model\Breadcrumbs;
- use PortalBundle\Model\Catalog;
- use PortalBundle\Services\ServiceService;
- use PortalBundle\Services\VehicleService;
- use Symfony\Component\HttpFoundation\Cookie;
- use Symfony\Component\HttpFoundation\Request;
- use Symfony\Component\HttpFoundation\RequestStack;
- use Symfony\Component\HttpFoundation\Response;
- use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
- use Symfony\Component\Routing\RouterInterface;
- class CarController extends BaseController
- {
-     private VehicleService $vehicleService;
-     public function __construct(VehicleService $vehicleService, CoreFormFactory $coreFormFactory, RequestStack $requestStack,
-                                 RouterInterface $router, Repository      $vehicleRepository, ServiceService $serviceService)
-     {
-         parent::__construct($coreFormFactory, $requestStack, $router, $vehicleRepository, $serviceService);
-         $this->vehicleService = $vehicleService;
-     }
-     /**
-      * @param Vehicle $CarModel
-      * @return array
-      */
-     private function buildCarForms(AbstractVehicle $CarModel): array
-     {
-         $TiForm = new Forms();
-         $BuyForm = new Forms();
-         $CreditForm = new Forms();
-         $TiForm->setVehicle($CarModel->getVehicleEntity());
-         $CreditForm->setVehicle($CarModel->getVehicleEntity());
-         return [
-             'testDrive' => $this->CoreFormFactory()->testDriveForm($CarModel->getDealer())->createView(),
-             'buyForm' => $this->CoreFormFactory()->buyForm($BuyForm, $CarModel->getVehicleEntity())->createView(),
-             'creditForm' => $this->CoreFormFactory()->creditForm($CarModel->getDealer(), $CreditForm)->createView()
-         ];
-     }
-     public function index(Request $request, \CoreBundle\Factory\Vehicle $vehicleFactory, HistoryManager $historyManager,
-                           \DcSiteBundle\Services\VehicleService $vehicleService, CreditModel $creditModel,
-                           LeasingClient $leasingClient, EntityManagerInterface $em): Response
-     {
-         $vehicleItemId = $request->get('variation');
-         $buyForm = new Forms();
-         /** @var Dealer $dealer */
-         $dealer = $em->getRepository(Dealer::class)->findOneBy(['url' => $request->get('dealer')]);
-         $variation = null;
-         if ($vehicleItemId) {
-             /** @var VehicleItem $vehicleItem */
-             $vehicleItem = $em->getRepository(VehicleItem::class)->getVehicleItemByVariation($vehicleItemId, $dealer);
-             if($vehicleItem && $vehicleItem->getSold()) {
-                 throw new NotFoundHttpException();
-             }
-             if($vehicleItem){
-                 $variation = $vehicleItem->getVariation()->getId();
-                 $vehicle = $vehicleFactory->createByVehicleItem($vehicleItem);
-                 $historyManager->setUserCarHistory($this->getUser(), $vehicle->getVehicleEntity(), $vehicleItem);
-             }
-         }
-         if(!$variation){
-             $vehicle = $vehicleFactory->createByUrl($request->get('url'), $dealer);
-         }
-         if (!$vehicle || $vehicle->isUsed()) {
-             throw new NotFoundHttpException();
-         }
-         $vehicleTypeData = VehicleType::getTypeDataById($vehicle->getVehicleType());
-         $vehicleTypeId = $vehicleTypeData['id'];
-         $vehicleEm = $vehicle->getVehicleEntity();
-         $vehicleService->addViews($vehicleEm);
-         $vehicleInStock = $this->vehicleService->getVehicleInStockByBrand($vehicleEm->getModel()->getBrand(), $this->getUser(), $vehicleTypeId, 10);
-         $countModelInStock = count($this->vehicleService->getVehicleInStock($vehicleEm->getModel(), $this->getUser()));
-         $vehicleUsed = $this->vehicleService->getVehicleUsedByBrand($vehicleEm->getModel()->getBrand(), $this->getUser(), $vehicleTypeId, 10);
-         $characteristicId = ($vehicle->getBodyType())? $vehicle->getBodyType()->getId() : null;
-         $vehiclePrice = $vehicle->price();
-         $modelId = $vehicle->getModel()->getId();
-         $vehicleBodyType = $this->vehicleService
-             ->getVehicleByCharacteristicId($this->getUser(), $characteristicId, false,null, $vehiclePrice, $modelId, 11);
-         $urlParams = [
-           'routeName' => 'portal_new_car',
-             'params' => [
-                 'dealer' => $dealer->getUrl(),
-                 'url'=> $vehicle->getModel()->getUrl(),
-             ]
-         ];
-         $vehicleColor = $vehicleService->getVehicleColor($vehicleEm);
-         $compareVehicleEquipment = ($vehicleTypeData['url'] == 'car')?$vehicleService->getCompareVehicleEquipment($vehicleEm, $urlParams):null;
-         $creditPayment = $creditModel->getMinPayment($vehicle);
-         $featuresIds = $this->vehicleService->getFeatures($this->getUser());
-         $leasingPayment = $leasingClient->getFirstAnnuitetData($vehicle->fullPrice(), $vehicle->getVehicleType());
-         $inArchive = ($vehicle->getShowDisabled() == 1 && $vehicle->getState() == 0 && $vehicle->isUsed() == 0);
-         return $this->basePortalRender('@Portal/Car/new-card-car.html.twig', [
-             'vehicle' => $vehicle,
-             'vehicleInStock' => $vehicleInStock,
-             'inArchive' => $inArchive,
-             'countModelInStock' => $countModelInStock,
-             'vehicleUsed' => $vehicleUsed,
-             'vehicleBodyType' => $vehicleBodyType,
-             'vehicleColor' => $vehicleColor,
-             'creditPayment' => $creditPayment,
-             'leasingPayment' => $leasingPayment->payment,
-             'compareVehicleEquipment' => $compareVehicleEquipment,
-             'leasingCalculatorForm' => $this->CoreFormFactory()->leasingForm()->createView(),
-             'dealer' => $dealer,
-             'type' => $vehicleTypeData['url'],
-             'state' => 'new',
-             'featuredId' => $featuresIds[$vehicle->getVehicleItemId()] ?? null,
-             'comparedId' => $this->vehicleService->getComparison($vehicle),
-             'buyForm' => $this->CoreFormFactory()->buyForm($buyForm, $vehicleEm, $vehicle->getVehicleItemId(),  null, false, false, $vehicle->getPrice())->createView(),
-         ]);
-     }
-     public function vehicleInStock(Request $request, InStockVehicle $inStockVehicleFactory, EntityManagerInterface $em,
-                                    \CoreBundle\Factory\Vehicle $vehicleFactory, \DcSiteBundle\Services\VehicleService $vehicleService,
-                                    CreditModel $creditModel, LeasingClient $leasingClient): Response
-     {
-         $buyForm = new Forms();
-         $dealer = $em->getRepository(Dealer::class)->findOneBy(['url' => $request->get('dealer')]);
-         if (!$dealer) {
-             throw $this->createNotFoundException();
-         }
-         /** @var Dealer $dealer */
-         $vehicle = $inStockVehicleFactory->createByUrl($request->get('url'), $dealer);
-         if (!$vehicle ) {
-             throw $this->createNotFoundException();
-         }
-         $vehicleEm = $vehicle->getVehicle();
-         $vehicleEntity = $vehicleFactory->createByEntity($vehicleEm);
-         $vehicleTypeData = VehicleType::getTypeDataById($vehicleEm->getVehicleType());
-         $vehicleInStock = $this->vehicleService->getVehicleInStock($vehicleEm->getModel(), $this->getUser(), $vehicleEm->getDealer(), 6);
-         $countModelInStock = count($this->vehicleService->getVehicleInStock($vehicleEm->getModel(), $this->getUser()));
-         $vehicleUsed = $this->vehicleService->getVehicleUsed($vehicleEm->getModel(), $this->getUser(), 6);
-         $vehiclePrice = $vehicle->Price();
-         $characteristicId = $vehicle->getBodyType()->getId();
-         $vehicleBodyType = $this->vehicleService
-             ->getVehicleInStockByBodyType($this->getUser(), $characteristicId, $vehiclePrice, 10);
-         $vehicleService->addViews($vehicleEm);
-         $featuresIds = $this->vehicleService->getFeatures($this->getUser());
-         $creditPayment = $creditModel->getMinPayment($vehicleEntity);
-         $leasingPayment = $leasingClient->getFirstAnnuitetData($vehicleEntity->fullPrice(), $vehicleEntity->getVehicleType());
-         return $this->basePortalRender('@Portal/Car/new-in-stock-card-car.html.twig', [
-             'vehicle' => $vehicle,
-             'vehicleInStock' => $vehicleInStock,
-             'countModelInStock' => $countModelInStock,
-             'vehicleUsed' => $vehicleUsed,
-             'vehicleBodyType' => $vehicleBodyType,
-             'creditPayment' => $creditPayment,
-             'leasingPayment' => $leasingPayment->payment,
-             'dealer' => $dealer,
-             'type' => $vehicleTypeData['url'],
-             'state' => 'new',
-             'featuredId' => $featuresIds[$vehicle->getVehicleItemId()] ?? null,
-             'comparedId' => $this->vehicleService->getComparison($vehicleEntity),
-             'leasingCalculatorForm' => $this->CoreFormFactory()->leasingForm()->createView(),
-             'buyForm' => $this->CoreFormFactory()
-                 ->buyForm($buyForm, $vehicleEm, $vehicle->getVehicleItemId(), null, false, true)->createView(),
-         ]);
-     }
-     public function vehicleUsed(Request $request, \CoreBundle\Factory\Vehicle $vehicleFactory,
-                                 VehicleViewService $vehicleViewService, CreditModel $creditModel, LeasingClient $leasingClient): Response
-     {
-         $vehicle = $vehicleFactory->createUsedByUrl($request->get('url'));
-         if(!$vehicle) {
-             throw new NotFoundHttpException();
-         }
-         $vehicleViewService->saveViewVehicle($vehicle, $request->getClientIp(), new DateTime());
-         $buyForm = new Forms();
-         $vehicleTypeData = VehicleType::getTypeDataById($vehicle->getVehicleType());
-         $dealer = $vehicle->getDealer();
-         $vehicleEm = $vehicle->getVehicleEntity();
-         $characteristicId = ($vehicle->getBodyType())? $vehicle->getBodyType()->getId() : null;
-         $vehicleInStock = $this->vehicleService->getVehicleInStock($vehicleEm->getModel(), $this->getUser(), $dealer, 6);
-         $vehicleUsed = $this->vehicleService->getVehicleUsed($vehicleEm->getModel(), $this->getUser(), 6);
-         $price = $vehicle->Price();
-         $vehicleBodyType = $this->vehicleService->getVehicleByCharacteristicId($this->getUser(), $characteristicId, true,100, $price, null, 11);
-         $featuresIds = $this->vehicleService->getFeatures($this->getUser());
-         $creditPayment = $creditModel->getMinPayment($vehicle);
-         $leasingPayment = $leasingClient->getFirstAnnuitetData($vehicle->fullPrice(), $vehicle->getVehicleType());
-         return $this->basePortalRender('@Portal/Car/new-used-card-car.html.twig', [
-             'vehicle' => $vehicle,
-             'vehicleInStock' => $vehicleInStock,
-             'vehicleUsed' => $vehicleUsed,
-             'vehicleBodyType' => $vehicleBodyType,
-             'creditPayment' => $creditPayment,
-             'leasingPayment' => $leasingPayment->payment,
-             'dealer' => $dealer,
-             'type' => $vehicleTypeData['url'],
-             'state' => 'new',
-             'featuredId' =>  $featuresIds[$vehicle->getVehicleItemId()] ?? null,
-             'comparedId' => $this->vehicleService->getComparison($vehicle),
-             'leasingCalculatorForm' => $this->CoreFormFactory()->leasingForm()->createView(),
-             'buyForm' => $this->CoreFormFactory()->buyForm($buyForm, $vehicleEm, $vehicle->getVehicleItemId(), null, true, false, $vehicle->getPrice())->createView(),
-             'orderTestDriveForm' => $this->CoreFormFactory()->buyForm($buyForm, $vehicleEm, $vehicle->getVehicleItemId())->createView(),
-             'hasNds' => $vehicle->getHasNds(),
-             'isSelect' => !in_array($vehicle->getDealer()->getId(), Catalog::NOT_VIDI_SELECT_DEALERS),
-         ]);
-     }
-     public function catalog(Request $request, \CoreBundle\Factory\Vehicle $vehicleFactory): Response
-     {
-         throw $this->createNotFoundException();
-         $carsCookie = $request->cookies->get('viewed-cars');
-         $models = [];
-         if ($carsCookie) {
-             $carsId = explode(',', $carsCookie);
-             foreach ($carsId as $oneId) {
-                 if (count($models) >= 2) continue;
-                 if (!($Car = $vehicleFactory->createById($oneId))) {
-                     continue;
-                 }
-                 $models[] = $Car;
-             }
-         }
-         return $this->basePortalRender('@Portal/Car/catalog.html.twig', [
-             'vModels' => $models,
-         ]);
-     }
-     /**
-      * @param Request $request
-      * @return Response
-      * @throws OptimisticLockException
-      */
-     public function usedCar(Request $request, \CoreBundle\Factory\Vehicle $vehicleFactory, EntityManagerInterface $em,
-                             HistoryManager $historyManager, Breadcrumbs $breadcrumbs): Response
-     {
-         $url = $request->get('url');
-         $CarModel = $vehicleFactory->createUsedByUrl($url);
-         if (!$CarModel) {
-             throw new NotFoundHttpException();
-         }
-         $CarModel->getVehicleEntity()->setViews((int)$CarModel->getVehicleEntity()->getViews() + 1);
-         $em->persist($CarModel->getVehicleEntity());
-         $em->flush();
-         $historyManager->setUserCarHistory($this->getUser(), $CarModel->getVehicleEntity());
-         $carsCookie = $request->cookies->get('viewed-cars');
-         $models = [];
-         $carsId = [];
-         if ($carsCookie) {
-             $carsId = explode(',', $carsCookie);
-             foreach ($carsId as $oneId) {
-                 if ($CarModel->getVehicleId() == $oneId) {
-                     continue;
-                 }
-                 //TODO remove magic numbers
-                 if (count($models) >= 2) {
-                     continue;
-                 }
-                 $car = $vehicleFactory->createById($oneId);
-                 if (!$car) {
-                     continue;
-                 }
-                 $models[] = $car;
-             }
-         }
-         //TODO remove magic numbers
-         if (!in_array($CarModel->getVehicleId(), $carsId)) {
-             if (count($carsId) >= 2) {
-                 $carsId = array_slice($carsId, 0, 1);
-             }
-             $carsId[] = $CarModel->getVehicleId();
-         }
-         $Response = new Response();
-         if ($carsId) {
-             $cookie = new Cookie('viewed-cars', implode(',', $carsId));
-             $Response->headers->setCookie($cookie);
-         }
-         $creditPaymentDisabled = false;
-         $TdForm = new Forms();
-         $TdForm->setVehicle($CarModel->getVehicleEntity());
-         return $this->basePortalRender(
-             '@Portal/Car/used-car.html.twig',
-             array_merge(
-                 ['forms' => $this->buildCarForms($CarModel)],
-                 [
-                     'model' => $CarModel,
-                     'tdForm' =>
-                         $this->CoreFormFactory()
-                             ->testDriveForm($CarModel->getDealer(), $TdForm, ['is_used' => true])
-                             ->createView(),
-                     'creditForm' => $this->CoreFormFactory()->creditForm($CarModel->getDealer())->createView(),
-                     'vModels' => $models,
-                     'creditPayment' => $creditPaymentDisabled,
-                     'options' => [],
-                     'breadcrumbs' => $breadcrumbs->generateByCarCard($CarModel),
-                 ]
-             ),
-             $Response
-         );
-     }
-     public function inStockOne(Request $request, EntityManagerInterface $em, InStockVehicle $inStockVehicleFactory): Response
-     {
-         $dealer = $em
-             ->getRepository(Dealer::class)
-             ->findOneBy(['url' => $request->get('dealer')]);
-         if (!$dealer) {
-             throw $this->createNotFoundException();
-         }
-         /** @var Dealer $dealer */
-         $inStockVehicle = $inStockVehicleFactory->createByUrl($request->get('url'), $dealer);
-         if (!$inStockVehicle) {
-             throw $this->createNotFoundException();
-         }
-         //TODO remove magic numbers
-         $posts['used'] = $em->getRepository(Post::class)->getUsedCarActions(3);
-         $posts['service'] = $em->getRepository(Post::class)->getServiceActions(3);
-         $posts['new'] = $em->getRepository(Post::class)->getNewCarActions(3);
-         $BuyForm = new Forms();
-         $TdForm = new Forms();
-         $TdForm->setVehicle($inStockVehicle->getVehicle());
-         $BuyForm->setVehicle($inStockVehicle->getVehicle());
-         return $this->basePortalRender('@Portal/Car/in-stock-card-car.html.twig', [
-             'model' => $inStockVehicle,
-             'buyForm' =>
-                 $this->CoreFormFactory()
-                     ->buyForm($BuyForm, $inStockVehicle->getVehicle(), $inStockVehicle->getVehicleItemId())
-                     ->createView(),
-             'testDrivePageForm' =>
-                 $this->CoreFormFactory()
-                 ->testDriveForm($inStockVehicle->getDealer(), $TdForm)
-                 ->createView(),
-             'creditForm' => $this->CoreFormFactory()->creditForm($inStockVehicle->getDealer())->createView(),
-             'dealer' => $dealer,
-             'posts' => $posts,
-             'leasingCalculatorForm' => $this->CoreFormFactory()->leasingForm()->createView(),
-         ]);
-     }
-     public function archive(\CoreBundle\Factory\Vehicle $vehicleFactory): Response
-     {
-         $vehicles = $this->vehicleRepository->getAllDisabled();
-         $result = [];
-         foreach ($vehicles as $vehicle) {
-             $model = $vehicleFactory->createByEntity($vehicle);
-             if (!$model) {
-                 continue;
-             }
-             $result[] = $model;
-         }
-         return $this->basePortalRender('@Portal/Car/archive.html.twig', ['cars' => $result]);
-     }
- }
-