<?php
namespace PortalBundle\Controller;
use CoreBundle\Component\CoreFormFactory;
use CoreBundle\Entity\Vehicles\EquipmentOptions;
use CoreBundle\Entity\Vehicles\VariationCharacteristic;
use CoreBundle\Entity\Vehicles\VehicleItem;
use CoreBundle\Model\Vehicles\Repository;
use DcSiteBundle\Services\AccessoryService;
use DcSiteBundle\Twig\TwigDcExtension;
use Exception;
use PortalBundle\Services\ComparisonService;
use PortalBundle\Services\ServiceService;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\RequestStack;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\RouterInterface;
use Symfony\Contracts\Translation\TranslatorInterface;
class ComparisonController extends BaseController
{
public function __construct(CoreFormFactory $coreFormFactory, RequestStack $requestStack, RouterInterface $router,
Repository $vehicleRepository, ServiceService $serviceService)
{
parent::__construct($coreFormFactory, $requestStack, $router, $vehicleRepository, $serviceService);
}
/**
* @param Request $request
* @return Response
*/
public function index(): Response
{
return $this->basePortalRender('@Portal/Comparison/comparison.html.twig');
}
public function init(Request $request, ComparisonService $comparisonService): JsonResponse
{
return new JsonResponse(['success' => true, 'data' => $comparisonService->initComparison($request)]);
}
public function getComparisonByItems(Request $request, ComparisonService $comparisonService): JsonResponse
{
$data = $comparisonService->getComparison($request);
if ($data['options']){
foreach($data['options'] as $key => $option){
if (isset($option['options']) && is_array($option['options'])) {
usort($option['options'], fn($a, $b) => $a['sort'] <=> $b['sort']);
}
$data['options'][$key]['options'] = $option['options'];
}
}
return new JsonResponse(['success' => true, 'data' => $data]);
}
private function buildComparison($vehicleItems, $locale, TwigDcExtension $twigDcExtension, TranslatorInterface $translator): array
{
$result = [
'cars' => [],
'tech' => [],
'options' => [],
];
$result['tech'][0] = [
'title' => $translator->trans('car_page.compare.year', [], 'dc_base'),
'vars' => []
];
/** @var VehicleItem $vehicleItem */
foreach ($vehicleItems as $vehicleItem) {
$carModel = $this->container->get('core.factory.vehicle')->createByVehicleItem($vehicleItem);
$result['cars'][$vehicleItem->getId()] = [
'id' => $vehicleItem->getId(),
'title' => $carModel->getFullName(),
'price' => $twigDcExtension->priceFilter(ceil($carModel->price())),
'image' => $carModel->getPreviewPath('small'),
'isUsed' => $carModel->isUsed(),
'equipment' => $carModel->isUsed() ? '' : $carModel->getEquipmentTitle()
];
$result['tech'][0]['vars'][$vehicleItem->getId()] = $vehicleItem->getYear();
/** @var VariationCharacteristic $vCharacteristic */
foreach ($vehicleItem->getVariation()->getCharacteristics() as $vCharacteristic) {
$characteristic = $vCharacteristic->getCharacteristic();
$result['tech'][$characteristic->getId()]['title'] = $characteristic->getTitle($locale);
$result['tech'][$characteristic->getId()]['vars'][$vehicleItem->getId()] = $vCharacteristic->getValue($locale);
}
$options = $vehicleItem->getEquipment()->getOptions();
/** @var EquipmentOptions $option */
foreach ($options as $option) {
$oneOption = $option->getOption();
$oType = $option->getOption()->getOptionType();
if (!isset($result['options'][$oType])) {
$result['options'][$oType] = [
'id' => $oType,
'title' => \CoreBundle\Model\Vehicles\EquipmentOptions::getTypeName($oType, $locale),
'options' => []
];
}
if (!isset($result['options'][$oType]['options'][$oneOption->getId()])) {
$opTitle = $locale == 'ru' ? $oneOption->getTitleRu() : $oneOption->getTitleUa();
$result['options'][$oType]['options'][$oneOption->getId()] = [
'id' => $oneOption->getId(),
'title' => $opTitle,
'values' => []
];
}
$result['options'][$oType]['options'][$oneOption->getId()]['values'][$vehicleItem->getId()] = [
'price' => $option->getPrice(),
'value' => $option->getValue($locale),
];
}
}
foreach ($result['tech'] as $charId => $row) {
$hasValues = false;
foreach ($row['vars'] as $val) {
if ($val) {
$hasValues = true;
}
}
if (!$hasValues) {
unset($result['tech'][$charId]);
}
}
return $result;
}
public function featured(AccessoryService $accessoryService)
{
try {
if (empty($this->getUser())) {
throw new Exception('Unauthorized', 401);
}
return $this->basePortalRender('@Portal/Comparison/featured.html.twig', [
'result' => $accessoryService->getListFavoritesAccessory($this->getUser())
]);
} catch (Exception $e) {
if ($e->getCode() === 401) {
return $this->redirectToRoute('my_login_page');
}
return $this->error($e);
}
}
}