<?php
namespace DcSiteBundle\Controller\Jaguar;
use CoreBundle\Component\CoreFormFactory;
use CoreBundle\Component\FormManager;
use CoreBundle\Entity\Vehicles\Vehicle;
use CoreBundle\Entity\Vehicles\VehicleFile;
use CoreBundle\Factory\Vehicle as VehicleFactory;
use CoreBundle\Model\Api\OnlineService\ApiServer1C;
use CoreBundle\Model\Post;
use CoreBundle\Model\Vehicles\Repository;
use CoreBundle\Model\WinnerRate;
use CoreBundle\Services\MediaExtensionVidi;
use DcSiteBundle\Entity\MainSlider;
use DcSiteBundle\Entity\ReplacementCarCondition;
use DcSiteBundle\Entity\SalesContract;
use DcSiteBundle\Entity\TermsMaintenance;
use DcSiteBundle\Model\Form\ServicesOrderForm;
use Doctrine\ORM\EntityManagerInterface;
use Exception;
use PortalBundle\Model\SeoMetaTag;
use Symfony\Component\Filesystem\Filesystem;
use Symfony\Component\HttpFoundation\JsonResponse;
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\Routing\RouterInterface;
use Twig\Environment;
class MainController extends BaseController
{
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)
{
parent::__construct($coreFormFactory, $seoMetaTag, $requestStack, $router, $formManager, $em, $apiServer1C, $session, $filesystem, $mediaExtensionVidi, $vehicleRepository, $vehicleFactory, $twig);
}
public function redirectJaguar(): RedirectResponse
{
return $this->redirectToRoute('jaguar_homepage', [], 302);
}
public function testDrivePrivacy(): ?Response
{
return $this->baseJaguarRender('@DcSite/Jaguar/td-privacy.html.twig');
}
public function index(Request $request): Response
{
$specials = $this->em->getRepository(\CoreBundle\Entity\Post::class)->getActionsByDealer($this->getDealer(), null, 4);
$news = $this->em->getRepository(\CoreBundle\Entity\Post::class)->getNewsByDealer($this->getDealer(), 4);
$sliders = $this->em->getRepository(MainSlider::class)->getMainSlidersByDealer($this->getDealer());
$sliders = array_map(fn($row) => [
'title' => $row->getTitle($request->getLocale()),
'subTitle' => $row->getSubTitle($request->getLocale()),
'btn' => $row->getBtnFstTitle($request->getLocale()),
'url' => $row->getUrl(),
'image' => $this->mediaExtensionVidi->getPath($row->getImage(), 'reference'),
'image_webp' => $this->mediaExtensionVidi->pathWebp($row->getImage(), 'reference'),
'image_mobile' => $this->mediaExtensionVidi->getPath($row->getImageMobile(), 'reference'),
'image_webp_mobile' => $this->mediaExtensionVidi->pathWebp($row->getImageMobile(), 'reference')
], $sliders);
$cars = $this->vehicleRepository->getNewByDealer($this->getDealer());
$cars = array_reduce($cars, function ($rows, $row) {
try {
$row = $this->vehicleFactory->createByEntity($row);
if (empty($row)) {
return $rows;
}
$rows[] = [
'vehicleId' => $row->getVehicleId(),
'isNew' => $row->isNew(),
'fullName' => $row->getFullName(),
'price' => round($row->price()),
'url' => $row->getUrl(),
'image' => $row->getPreviewPath('reference'),
'image_webp' => $row->getPreviewPathWebp('reference')
];
return $rows;
} catch (Exception $e) {
return $rows;
}
}, []);
return $this->baseJaguarRender('@DcSite/Jaguar/Main/index.html.twig', [
'buyInStockForm' => $this->CoreFormFactory()->buyInStockForm()->createView(),
'cars' => $cars,
'news' => $news,
'specials' => $specials,
'sliders' => $sliders,
]);
}
public function modelLineup(): ?Response
{
$vehicles = $this->vehicleRepository->getNewByDealer($this->getDealer());
$result = [];
foreach ($vehicles as $vehicle) {
$result[] = $this->vehicleFactory->createByEntity($vehicle);
}
$specials = $this->em->getRepository(\CoreBundle\Entity\Post::class)->getActionsByDealer($this->getDealer(), null, 4);
$news = $this->em->getRepository(\CoreBundle\Entity\Post::class)->getNewsByDealer($this->getDealer(), 4);
$sliders = $this->em->getRepository(MainSlider::class)->getMainSlidersByDealer($this->getDealer());
return $this->baseJaguarRender('@DcSite/Jaguar/model-lineup.html.twig', [
'buyInStockForm' => $this->CoreFormFactory()->buyInStockForm()->createView(),
'cars' => $result,
'news' => $news,
'specials' => $specials,
'sliders' => $sliders,
]);
}
public function notFound(): ?Response
{
$Response = new Response();
$Response->setStatusCode(Response::HTTP_NOT_FOUND);
return $this->baseJaguarRender('@DcSite/Jaguar/404.html.twig', [], $Response);
}
public function specialOffers(): ?Response
{
$specialsCars = $this->em->getRepository(\CoreBundle\Entity\Post::class)->getActionsByDealer($this->getDealer(), Post::ACTION_TYPE_CAR);
$specialsService = $this->em->getRepository(\CoreBundle\Entity\Post::class)->getActionsByDealer($this->getDealer(), Post::ACTION_TYPE_SERVICE);
return $this->baseJaguarRender('@DcSite/Jaguar/Specials/special-offers.html.twig', [
'specialsCars' => $specialsCars,
'specialsService' => $specialsService,
]);
}
public function specialOffersSingle(Request $request, Post $postModel, $url): ?Response
{
$post = $postModel->initByUrl($this->getDealer(), $url);
return $this->baseJaguarRender('@DcSite/Jaguar/Specials/special-offers-single.html.twig', [
'post' => $post,
'serviceOrderForm' => $this->CoreFormFactory()->servicesOrderForm(ServicesOrderForm::LEASING, $request->getLocale())->createView()
]);
}
public function menuInit(Request $request, WinnerRate $winnerRate): JsonResponse
{
$vehicles = $this->vehicleRepository->getNewByDealer($this->getDealer());
$rate = $winnerRate->getRateWinner($this->getDealer());
$data = [];
$position = [];
/** @var $vehicle Vehicle */
foreach ($vehicles as $vehicle) {
$vehicleModel = $this->vehicleFactory->createByEntity($vehicle);
if (!$vehicleModel) {
continue;
}
$vehicleId = $vehicleModel->getVehicleId();
$data[$vehicleId] = [
'id' => $vehicleId,
'name' => $vehicleModel->getModelName(),
'modelName' => $vehicleModel->getModelName(),
'preview' => $vehicleModel->getPreviewPath('big'),
'preview_webp' => $vehicleModel->getPreviewPathWebp('reference'),
'price' => $vehicleModel->price(),
'isNew' => $vehicleModel->isNew(),
'isPreOrder' => $vehicleModel->isPreOrder(),
'slogan' => $vehicleModel->getSlogan($request->getLocale()),
'url' => $vehicleModel->getUrl(),
'link' => $this->router->generate('jaguar_card_car', ['car' => $vehicleModel->getUrl()]),
'linkCarConfiguration' => $this->router->generate('jaguar_card_car_configuraion', ['car' => $vehicleModel->getUrl()]),
'configuratorPath' => $this->router->generate('jaguar_car_configurator', ['url' => $vehicleModel->getUrl()]),
];
$position[$vehicleId] = $vehicle->getPosition();
}
array_multisort($position, SORT_ASC, $data);
return $this->json(['success' => true, 'data' => $data, 'rate' => $rate, 'date' => date('d.m.Y')]);
}
public function conditions(): ?Response
{
$filesByType = $this->em->getRepository(SalesContract::class)->getFilesByTypes($this->getDealer());
return $this->baseJaguarRender('@DcSite/Jaguar/conditions-of-sales.html.twig', [
'filesByType' => $filesByType
]);
}
public function termsMaintenance(): ?Response
{
$files = $this->em->getRepository(TermsMaintenance::class)->findBy(['dealer' => $this->getDealer()], ['begin_date' => 'ASC']);
return $this->baseJaguarRender('@DcSite/Jaguar/terms-maintenance.html.twig', [
'mainFile' => array_pop($files),
'files' => $files,
'dealer' => $this->getDealer(),
]);
}
public function cokie(): ?Response
{
return $this->baseJaguarRender('@DcSite/Jaguar/cokie-and-privacy-policy.html.twig');
}
public function broshure(Request $request): ?Response
{
$vehicles = $this->vehicleRepository->getNewByDealer($this->getDealer());
$result = [];
/** @var Vehicle $car */
foreach ($vehicles as $car) {
$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[] = $item;
}
return $this->baseJaguarRender('@DcSite/Jaguar/broshure.html.twig', ['cars' => $result]);
}
public function personalProposition(): ?Response
{
return $this->baseJaguarRender('@DcSite/Jaguar/personal-proposition.html.twig');
}
public function termsReplacement(): ?Response
{
$files = $this->em->getRepository(ReplacementCarCondition::class)->findBy(['dealer' => $this->getDealer()], ['begin_date' => 'DESC']);
return $this->baseJaguarRender('@DcSite/Jaguar/Terms/terms-providing-replacement-car.html.twig', [
'files' => $files,
]);
}
}