<?php
namespace DcSiteBundle\Controller\Toyota;
use BmpGatewayBundle\Entity\VehicleTestDrive;
use CoreBundle\Component\CoreFormFactory;
use CoreBundle\Component\FormManager;
use CoreBundle\Entity\Forms;
use CoreBundle\Entity\Vehicles\Category;
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\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 Doctrine\ORM\EntityManagerInterface;
use Exception;
use InsuranceBundle\Model\Program;
use PortalBundle\Model\SeoMetaTag;
use Symfony\Component\Filesystem\Filesystem;
use Symfony\Component\HttpFoundation\RedirectResponse;
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 BaseController
{
const MODEL_FRAME = [
'yaris',
'yaris-hybrid',
'yaris-cross',
'yaris-cross-hybrid',
'corolla',
'corolla-cross',
'corolla-hybrid',
'avensis',
'camry',
'camry-hybrid',
'c-hr',
'c-hr-hybrid',
'rav4',
'rav4-hybrid',
'highlander',
'highlander-hybrid',
'land-cruiser-prado',
'land-cruiser',
'hilux',
'proace',
'proace-city',
'proace-city-verso',
];
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, HistoryManager $historyManager, VehicleService $vehicleService, CreditModel $creditModel, $car): ?Response
{
$dealer = $this->getDealer();
$vehicle = $this->vehicleFactory->createByUrl($car, $dealer);
if (!$vehicle) {
throw new NotFoundHttpException();
}
$vehicleEm = $vehicle->getVehicleEntity();
$vehicleColor = $vehicleService->getVehicleColor($vehicleEm);
$vehicleFaqs = $vehicleService->getVehicleFaqs($vehicleEm);
$carInStock = $this->carInStockService->getCarInStockByModel($this->getDealer(), $request->getLocale(), $vehicleEm->getModel(), 4);
$carUsed = $this->usedVehicleService->getUsedVehicleByModel($this->getDealer(), $request->getLocale(), $vehicleEm->getModel(), 4);
$historyManager->setUserCarHistory($this->getUser(), $vehicleEm);
$TdForm = new Forms();
$TdForm->setVehicle($vehicleEm);
$vehicleFirstImage = null;
$carGallery = $vehicle->getGallery()->getGalleryItems();
if ($carGallery->count()) {
$media = $this->mediaExtensionVidi;
$vehicleFirstImage = $media->getPath($carGallery->first()->getMedia(), 'small');
foreach ($carGallery as $value) {
$value->img = $media->getPath($value->getMedia(), 'slider2');
$value->img_mob = $media->getPath($value->getMedia(), 'slider2_mob');
$value->img_webp = $media->pathWebp($value->getMedia(), 'slider2');
$value->img_webp_mob = $media->pathWebp($value->getMedia(), 'slider2_mob');
// img alt (SEO)
$value->title = $vehicle->getTitle($request->getLocale());
// magnific-popup
$value->url = $media->pathWebp($value->getMedia(), 'hd');
}
}
$vehiclePriceEquipment = $vehicleService->getVehiclePriceEquipment($vehicleEm);
foreach ($vehicle->getVehicleItems() as $item) {
$vehicleYear[$item->getYear()] = $item->getYear();
}
usort($vehiclePriceEquipment, fn($a, $b) => $a['position'] <=> $b['position']);
$form = $this->CoreFormFactory()
->callMeForm(new Forms(), true);
$form->get('dealer')->setData($this->getDealer());
return $this->baseToyotaRender(
'@DcSiteBundle/Toyota/Car/car-card.html.twig',
[
'slides' => $carGallery,
'vehicle' => $vehicle,
'vehiclePriceEquipment' => $vehiclePriceEquipment,
'vehicleColor' => $vehicleColor,
'carInStock' => $carInStock,
'carUsed' => $carUsed,
'faqs' => $vehicleFaqs,
'vehicleFirstImage' => $vehicleFirstImage,
'vehicleYear' => array_values($vehicleYear),
'creditPayment' => $creditModel->getMinPayment($vehicle),
'buyForm' => $this->CoreFormFactory()->buyForm(null, $vehicleEm)->createView(),
'buyPartsForm' => $this->CoreFormFactory()->buyPartsForm($this->getDealer())->createView(),
'testDrivePageForm' => $this->CoreFormFactory()->testDriveForm($this->getDealer(), $TdForm)->createView(),
'structuredData' => $this->getCarPageStructuredData($request, $vehicle),
'hasTestDrive' => $this->em
->getRepository(VehicleTestDrive::class)
->hasTestDrive($dealer, $vehicle->getModel()),
'leasingCalculatorForm' => $this->CoreFormFactory()->leasingForm()->createView(),
'callMeForm' => $form->createView(),
]
);
}
public function comparison(Request $request, $model): ?Response
{
$dealer = $this->getDealer();
$vehicle = $this->vehicleFactory->createByUrl($model, $dealer);
if (!$vehicle) {
throw new NotFoundHttpException();
}
$comparison = $this->get('portal.comparison.service')->initComparison($request, $vehicle);
if ($comparison['options']) {
foreach ($comparison['options'] as $key => $option) {
if (isset($option['options']) && is_array($option['options'])) {
usort($option['options'], fn($a, $b) => $a['sort'] <=> $b['sort']);
}
$comparison['options'][$key]['options'] = $option['options'];
}
}
return $this->baseToyotaRender('@DcSiteBundle/Toyota/Сomparison/comparison.html.twig',
[
'vehicle' => $vehicle,
'comparison' => $comparison
]
);
}
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->baseToyotaRender('@DcSite/Toyota/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->baseToyotaRender('@DcSite/Toyota/Car/catalog.html.twig', [
'category' => null,
'catalog' => $catalog,
'catalogVehicle' => $catalogVehicle,
'catalogModelRangePages' => $pagesService
->setLang($request->getLocale())
->getPages($this->getDealer())
]);
}
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->baseToyotaRender('@DcSite/Toyota/Car/catalog.html.twig', [
'category' => $category,
'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->baseToyotaRender('@DcSite/Toyota/Car/catalog-page.html.twig', ['page' => $page]);
}
public function inStockList(Request $request): Response
{
$vehicles = $this->carInStockService->getCarInStockByDealer(
$this->getDealer(),
null,
$request->getLocale()
);
$this->carInStockService->sortVehicleByDealer($vehicles, $this->getDealer()->getUniqueId());
return $this->baseToyotaRender('@DcSite/Toyota/Car/in-stock-catalog.html.twig', ['vehicles' => $vehicles]);
}
public function inStockSingle(Request $request, InStockVehicle $inStockVehicleFactory, $url): Response
{
$car = $inStockVehicleFactory->createByUrl($url, $this->getDealer());
if (!$car) {
$car = $inStockVehicleFactory->createByUrl($url, $this->getDealer(), false);
if ($car) {
return $this->redirectToRoute('toyota_one_car', ['car' => $car->getVehicle()->getUrl()], 301);
}
return $this->redirectToRoute('toyota_in_stock_catalog', [], 301);
}
$options = $car->getOptions($request->getLocale());
$carGallery = $car->getInStockEntity()
->getGallery()
->getGalleryItems();
if ($carGallery->count()) {
$media = $this->mediaExtensionVidi;
foreach ($carGallery as $value) {
$value->image = $media->getPath($value->getMedia(), 'reference');
$value->image_webp = $media->pathWebp($value->getMedia(), 'reference');
}
}
$form = $this->CoreFormFactory()->callMeForm(new Forms(), true);
$form->get('dealer')->setData($this->getDealer());
return $this->baseToyotaRender(
'@DcSite/Toyota/Car/in-stock-single.html.twig',
[
'model' => $car,
'modelGallery' => $carGallery,
'testDrive' => $this->CoreFormFactory()->testDriveForm($this->getDealer())->createView(),
'tiForm' => $this->CoreFormFactory()->tradeInFrom($this->getDealer())->createView(),
'buyInStockForm' =>
$this->CoreFormFactory()->buyInStockForm(null, $car->getInStockEntity())->createView(),
'creditForm' => $this->CoreFormFactory()->creditForm($this->getDealer())->createView(),
'options' => $options,
'structuredCarData' => $this->getCarStructuredDataCarInStock($request, $car),
'callMeForm' => $form->createView(),
]
);
}
public function secondhandList(): Response
{
return $this->baseToyotaRender('@DcSite/Toyota/Car/car-in-stock-frame.html.twig',
[
'vehicle' => self::MODEL_FRAME,
]);
}
public function secondhandModel($model): ?Response
{
if (substr($model, -7) == '-hybrid') {
$isHybrid = true;
} else {
$isHybrid = false;
}
if (!in_array($model, self::MODEL_FRAME)) {
throw new NotFoundHttpException();
}
return $this->baseToyotaRender('@DcSite/Toyota/Car/car-in-stock-frame-model.html.twig',
[
'model' => $model,
'isHybrid' => $isHybrid,
]);
}
public function accessories(): RedirectResponse
{
return $this->redirect('https://shop.toyota-ua.com/', Response::HTTP_MOVED_PERMANENTLY);
}
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 = $translator->trans('base.seo.configurator.h1', [], 'dc_toyota');
//TODO remove magic numbers
$carId = 0;
if ($Vehicle) {
$h1Tag =
$translator->trans(
'base.seo.configurator.h1_car',
['%model%' => $Vehicle->getModel()->getTitle()],
'dc_toyota'
);
$carId = $Vehicle->getVehicleId();
}
return $this->baseToyotaRender('@DcSite/Toyota/Configurator/index.html.twig', [
'carId' => $carId,
'car' => $Vehicle,
'h1Tag' => $h1Tag,
'baseType' => Program::BASE_COEFFICIENT_TYPE,
'listType' => Program::LIST_COEFFICIENT_TYPE,
'optionType' => Program::OPTION_COEFFICIENT_TYPE,
'hash' => $hash,
]);
}
public function offerCar(Request $request): Response
{
$vehicles = $this->vehicleRepository->getActionVehicleItems($this->getDealer());
$vehicles = array_reduce($vehicles, function ($vehicles, VehicleItem $vehicle) use ($request) {
try {
$model = $this->vehicleFactory->createByVehicleItem($vehicle);
if (empty($model)) {
return $vehicles;
}
$modelVehicleID = $model->getVehicleId();
$modelVehicle = [
'id' => $model->getVehicleId(),
'fullName' => $model->getFullName(),
'title' => $model->getTitle($request->getLocale()),
'url' => $model->getUrl(),
'hasHybrid' => $model->hasHybrid(),
'price' => round($model->price()),
'fullPrice' => round($model->fullPrice()),
'image' => $model->getPreviewPath('reference'),
'image_webp' => $model->getPreviewPathWebp('reference')
];
if (!array_key_exists($modelVehicleID, $vehicles)) {
$vehicles[$modelVehicleID] = $modelVehicle;
return $vehicles;
}
if ($vehicles[$modelVehicleID]['price'] > $model->price()) {
$vehicles[$modelVehicleID] = $modelVehicle;
}
return $vehicles;
} catch (Exception $e) {
return $vehicles;
}
}, []);
return $this->baseToyotaRender('@DcSite/Toyota/Car/offer-of-the-day.html.twig', ['vehicles' => $vehicles]);
}
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->baseToyotaRender('@DcSite/Toyota/Car/archive.html.twig', ['cars' => $result]);
}
}