<?php
namespace DcSiteBundle\Controller\Lexus;
use CoreBundle\Component\CoreFormFactory;
use CoreBundle\Component\FormManager;
use CoreBundle\Entity\Vehicles\Vehicle;
use CoreBundle\Factory\Vehicle as VehicleFactory;
use CoreBundle\Model\Api\OnlineService\ApiServer1C;
use CoreBundle\Model\Vehicles\Repository;
use CoreBundle\Services\MediaExtensionVidi;
use DcSiteBundle\Entity\ReplacementCarCondition;
use DcSiteBundle\Entity\SalesContract;
use DcSiteBundle\Entity\TermsMaintenance;
use DcSiteBundle\Services\MainSliderService;
use Doctrine\ORM\EntityManagerInterface;
use PortalBundle\Model\SeoMetaTag;
use Symfony\Component\Asset\Packages;
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 redirectLexus(): RedirectResponse
{
return $this->redirectToRoute('lexus_homepage', [], 301);
}
public function index(Request $request, MainSliderService $mainSliderService): ?Response
{
$mainSliderService->setLang($request->getLocale())->setSlideFirst($request->query->getInt('slide', 0));
return $this->baseLexusRender('@DcSite/Lexus/Main/index.html.twig', [
// 'buyForm' => $this->CoreFormFactory()->buyForm(null, null, null, $this->getDealer())->createView(),
'slides' => $mainSliderService->getSlidesNew($this->getDealer()),
'serviceForm' => $this->CoreFormFactory()->serviceForm()->createView(),
]);
}
public function carCatalog(Request $request, Packages $manager): JsonResponse
{
$vehicles = $this->vehicleRepository->getNewByDealer($this->getDealer());
$data = [];
$categories = [];
/**
* @var $vehicle Vehicle
*/
foreach ($vehicles as $key => $vehicle) {
$Group = $vehicle->getGroup();
if (!$Group) {
continue;
}
$categoriesInst = $vehicle->getCategories();
if (!$categoriesInst) {
continue;
}
foreach ($categoriesInst as $category) {
$catId = $category->getId();
if (!isset($categories[$catId])) {
$categories[$catId] = [
'id' => $catId,
'title' => $category->getTitle($request->getLocale()),
];
}
$groupId = $Group->getId();
$carModel = $this->vehicleFactory->createByEntity($vehicle);
if (!$carModel) {
continue;
}
if (!isset($data[$groupId])) {
$groupImage = $this->mediaExtensionVidi->getPath($Group->getPreview(), 'small');
$groupImage = $this->webpUpdate($request, $groupImage, $manager);
$data[$groupId] = [
'id' => $groupId,
'catId' => $catId,
'title' => $Group->getTitle($request->getLocale()),
'slogan' => $carModel->getSlogan($request->getLocale()),
'image' => $groupImage,
'position' => $Group->getPosition(),
'price' => $carModel->price(),
'hasActionPrice' => $carModel->hasActionPrice(),
'models' => [],
];
}
$data[$groupId]['catIds'][] = $category->getId();
$data[$groupId]['models'][] = [
'title' => $carModel->getModelName(),
'link' => $this->router->generate('lexus_card_car', ['url' => $carModel->getUrl()]),
'price' => $carModel->price(),
];
if ($data[$Group->getId()]['price'] == 0 && !($key + 1 > count($vehicles))) {
$temporaryVehicleEm = $this->vehicleFactory->createByEntity($vehicles[$key + 1]);
$data[$Group->getId()]['price'] = $temporaryVehicleEm->price();
}
$data[$groupId]['price'] = $carModel->price();
foreach ($data[$groupId]['models'] as $model) {
if ($model['price'] != 0 && $model['price'] < $data[$groupId]['price']) {
$data[$groupId]['price'] = $model['price'];
}
}
$modelExists = false;
foreach ($data[$groupId]['models'] as $existingModel) {
if ($existingModel['title'] == $carModel->getModelName()) {
$modelExists = true;
break;
}
}
if (!$modelExists) {
$data[$groupId]['models'][] = [
'title' => $carModel->getModelName(),
'link' => $this->router->generate('lexus_card_car', ['url' => $carModel->getUrl()]),
];
}
}
}
usort($data, fn($a, $b) => ($a['position'] == $b['position']) ? 0 : (($a['position'] < $b['position']) ? -1 : 1));
foreach ($data as &$item) {
$uniqueModels = [];
foreach ($item['models'] as $model) {
$uniqueModels[$model['link']] = $model;
}
$item['models'] = array_values($uniqueModels);
}
return $this->json(['data' => $data, 'categories' => $categories]);
}
public function notFound(Request $request): ?Response
{
$Response = new Response();
$Response->setStatusCode(Response::HTTP_NOT_FOUND);
return $this->baseLexusRender('@DcSite/Lexus/404.html.twig', ['_locale' => $request->getLocale()], $Response);
}
public function conditionOfSales(): ?Response
{
$filesByType = $this->em->getRepository(SalesContract::class)->getFilesByTypes($this->getDealer());
return $this->baseLexusRender('@DcSite/Lexus/condition-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->baseLexusRender('@DcSite/Lexus/terms-maintenance.html.twig', [
'mainFile' => array_pop($files),
'files' => $files,
'dealer' => $this->getDealer(),
]);
}
public function termsReplacement(): ?Response
{
$files = $this->em->getRepository(ReplacementCarCondition::class)->findBy(['dealer' => $this->getDealer()], ['begin_date' => 'DESC']);
return $this->baseLexusRender('@DcSite/Lexus/Terms/terms-providing-replacement-car.html.twig', [
'files' => $files,
]);
}
public function onlineBooking(): ?Response
{
return $this->baseLexusRender('@DcSite/Lexus/online-booking.html.twig');
}
}