<?php
namespace DcSiteBundle\Controller\LandRover;
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 DcSiteBundle\Services\ModelRange\Pages\PagesService;
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\HttpKernel\Exception\NotFoundHttpException;
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 redirectLandRover(): RedirectResponse
{
return $this->redirectToRoute('landrover_homepage', [], 301);
}
public function index(Request $request): Response
{
$media = $this->mediaExtensionVidi;
$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' => $media->getPath($row->getImage(), 'reference'),
'image_webp' => $media->pathWebp($row->getImage(), 'reference'),
'image_mobile' => $media->getPath($row->getImageMobile(), 'reference'),
'image_webp_mobile' => $media->pathWebp($row->getImageMobile(), 'reference')
], $sliders);
$cars = $this->vehicleRepository->getNewByDealer($this->getDealer());
$cars = array_reduce($cars, function ($rows, $row) use ($request) {
try {
$row = $this->vehicleFactory->createByEntity($row);
if (empty($row)) {
return $rows;
}
$rows[] = [
'vehicleId' => $row->getVehicleId(),
'isNew' => $row->isNew(),
'fullName' => $row->getFullName(),
'modelName' => $row->getModelName(),
'slogan' => $row->getSlogan($request->getLocale()),
'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->baseLandRoverRender('@DcSite/LandRover/Main/index.html.twig', [
'serviceForm' => $this->CoreFormFactory()->serviceForm()->createView(),
'cars' => $cars,
'sliders' => $sliders
]);
}
public function modelLineup(Request $request, PagesService $pagesService): ?Response
{
$sliders = $this->em->getRepository(MainSlider::class)->getMainSlidersByDealer($this->getDealer());
$vehicles = $this->vehicleRepository->getNewByDealer($this->getDealer());
$result = [];
foreach ($vehicles as $vehicle) {
$result[] = $this->vehicleFactory->createByEntity($vehicle);
}
return $this->baseLandRoverRender('@DcSite/LandRover/model-lineup.html.twig', [
'serviceForm' => $this->CoreFormFactory()->serviceForm()->createView(),
'cars' => $result,
'sliders' => $sliders,
'catalogModelRangePages' => $pagesService
->setLang($request->getLocale())
->getPages($this->getDealer())
]);
}
public function modelLineupPage(Request $request, PagesService $pagesService, string $url): ?Response
{
$page = $pagesService
->setLang($request->getLocale())
->getPage($this->getDealer(), $url);
if (empty($page)) {
throw new NotFoundHttpException();
}
return $this->baseLandRoverRender('@DcSite/LandRover/model-lineup-page.html.twig', ['page' => $page]);
}
public function notFound(): ?Response
{
// $Response = new Response('',Response::HTTP_NOT_FOUND);
// return $this->$this->baseLandRoverRender('@DcSite/LandRover/404.html.twig', ['_locale' => $request->getLocale()]);
$Response = new Response();
$Response->setStatusCode(Response::HTTP_NOT_FOUND);
return $this->baseLandRoverRender('@DcSite/LandRover/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->baseLandRoverRender('@DcSite/LandRover/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->baseLandRoverRender('@DcSite/LandRover/Specials/specials-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());
$domain = $this->getDealer()->getDomain();
$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(),
'slogan' => $vehicleModel->getSlogan($request->getLocale()),
'url' => $vehicleModel->getUrl(),
'link' => 'https://' . $domain . $this->router->generate('landrover_card_car', ['car' => $vehicleModel->getUrl()]),
'linkCarConfiguration' => 'https://' . $domain . $this->router->generate('landrover_card_car_configuraion', ['car' => $vehicleModel->getUrl()]),
'configuratorPath' => 'https://' . $domain . $this->router->generate('landrover_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 consent(): ?Response
{
return $this->baseLandRoverRender('@DcSite/LandRover/consent.html.twig');
}
public function cokie(): ?Response
{
return $this->baseLandRoverRender('@DcSite/LandRover/cokie-and-privacy-policy.html.twig');
}
public function testDrivePrivacy(): ?Response
{
return $this->baseLandRoverRender('@DcSite/LandRover/td-privacy.html.twig');
}
public function conditions(): ?Response
{
$filesByType = $this->em->getRepository(SalesContract::class)->getFilesByTypes($this->getDealer());
return $this->baseLandRoverRender('@DcSite/LandRover/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->baseLandRoverRender('@DcSite/LandRover/terms-maintenance.html.twig', [
'mainFile' => array_pop($files),
'files' => $files,
'dealer' => $this->getDealer(),
]);
}
public function broshure(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->baseLandRoverRender('@DcSite/LandRover/broshure.html.twig', ['cars' => $result]);
}
public function personalProposition(): ?Response
{
return $this->baseLandRoverRender('@DcSite/LandRover/personal-proposition.html.twig');
}
public function termsReplacement(): ?Response
{
$files = $this->em->getRepository(ReplacementCarCondition::class)->findBy(['dealer' => $this->getDealer()], ['begin_date' => 'DESC']);
return $this->baseLandRoverRender('@DcSite/LandRover/Terms/terms-providing-replacement-car.html.twig', [
'files' => $files,
]);
}
}