<?php 
 
namespace AutomarketBundle\Controller; 
 
use AutomarketBundle\Services\MainService; 
use CoreBundle\Component\CoreFormFactory; 
use CoreBundle\Factory\Vehicle; 
use DateTime; 
use DcSiteBundle\Model\CreditModel; 
use DcSiteBundle\Services\VehicleViewService; 
use Doctrine\ORM\EntityManagerInterface; 
use PortalBundle\Model\SeoMetaTag; 
use Symfony\Component\HttpFoundation\RequestStack; 
use Symfony\Component\HttpFoundation\Response; 
use CoreBundle\Entity\Featured; 
use CoreBundle\Model\Vehicles\AbstractVehicle; 
use DcSiteBundle\Form\SendQuestionType; 
use PortalBundle\Model\Catalog; 
use Symfony\Component\HttpFoundation\Request; 
use Symfony\Component\HttpKernel\Exception\NotFoundHttpException; 
use Symfony\Component\Routing\RouterInterface; 
 
class CarController extends BaseController 
{ 
    private MainService $mainService; 
    private RouterInterface $router; 
    public function __construct(CoreFormFactory $coreFormFactory, RequestStack $requestStack, EntityManagerInterface $em, 
                                SeoMetaTag $seoMetaTag, RouterInterface $router, MainService $mainService) 
    { 
        parent::__construct($coreFormFactory, $requestStack, $em, $seoMetaTag); 
        $this->router = $router; 
        $this->mainService = $mainService; 
    } 
 
    public function car(Request $request, VehicleViewService $vehicleViewService, CreditModel $creditModel, Vehicle $vehicleFactory): Response 
    { 
        $lang = $request->getLocale(); 
        $id = $request->get('id'); 
        $vehicle = $vehicleFactory->createUsedById($id); 
        if (!$vehicle || (!$vehicle->getState() && !$vehicle->getSold())) { 
            throw new NotFoundHttpException(); 
        } 
 
        $vehicleViewService->saveViewVehicle($vehicle, $request->getClientIp(), new DateTime()); 
 
        $vehicle->getVehicleEntity()->setViews((int)$vehicle->getVehicleEntity()->getViews() + 1); 
        $this->em->persist($vehicle->getVehicleEntity()); 
        $this->em->flush(); 
 
        $this->mainService->setLang($request->getLocale()); 
 
        //TODO Видалити коли буде merge VIDI карточки авто 
        $featuresIds = $this->getFeatures($this->getUser()); 
        $isFeature = $featuresIds[$vehicle->getVehicleItemId()] ?? null; 
 
        //TODO Видалити коли буде merge VIDI карточки авто 
        $isCompared = $this->getComparison($vehicle); 
 
        if($this->getUser() && $this->getUser()->hasRole('ROLE_EMPLOYEE_MANAGER') && $vehicle->getFiles() && $vehicle->getFiles()->first()){ 
            $file = $vehicle->getFiles()->first(); 
            $pathFile = $this->router->generate('base_download_file', ['id' => $file->getId()]); 
        } 
 
        return $this->baseAutomarketRender('@Automarket/Car/card-car.html.twig', [ 
            'vehicle' => $vehicle, 
            'pathFile' => $pathFile ?? null, 
            'featuredId' => $isFeature, 
            'comparedId' => $isCompared, 
            'isSelect' => !in_array($vehicle->getDealer()->getId(), Catalog::NOT_VIDI_SELECT_DEALERS), 
            'creditPayment' => $creditModel->getMinPayment($vehicle), 
            'vehicleType1' => $this->mainService->getProposeVehicles($this->getDealer(), $this->getUser(), true, $lang, $vehicle, $vehicle->getVehicleItemId(), true), 
            'vehicleType2' => $this->mainService->getProposeVehicles($this->getDealer(), $this->getUser(), true, $lang, $vehicle, $vehicle->getVehicleItemId()), 
            'vehicleType3' => $this->mainService->getNewArrivals($this->getDealer(), $this->getUser(), true, $lang), 
            'buyForm' => $this->CoreFormFactory()->buyForm(null, $vehicle->getVehicleEntity())->createView(), 
            'sendQuestionForm' => $this->CoreFormFactory()->sendQuestionForm(null, $this->getDealer(), null, SendQuestionType::NOTIFY_ABOUT_PRICE_TYPE)->createView(), 
            'vehicleUrl' => $request->getSchemeAndHttpHost().$this->router->generate('automarket_vehicle', ['state' => $request->get('state'), 'type' => $request->get('type'), 'brand' => $request->get('brand'), 'model' => $request->get('model'), 'id' => $request->get('id')]), 
            'privacyLink' => $this->router->generate('automarket_personal_data_agreement'), 
        ]); 
    } 
 
    //TODO Видалити коли буде merge VIDI карточки авто 
    public function getComparison(AbstractVehicle $vehicle) 
    { 
        $request = $this->requestStack->getCurrentRequest(); 
        $compareCookie = $request->cookies->get('compare'); 
        $vehicleComparison = explode(',', $compareCookie); 
 
        return in_array($vehicle->getVehicleItemId(), $vehicleComparison) ? $vehicle->getVehicleItemId() : null; 
 
    } 
 
    //TODO Видалити коли буде merge VIDI карточки авто 
    public function getFeatures($user): array 
    { 
        $featuresIds = []; 
 
        if (!$user) { 
            return $featuresIds; 
        } 
 
        $features = $this->em->getRepository(Featured::class)->findBy(['type' => 'vehicle', 'user' => $user]); 
 
        /** @var Featured $feature */ 
        foreach ($features as $feature) { 
            $favData = json_decode($feature->getData()); 
 
            if (!isset($favData->vehicleItemId)) { 
                continue; 
            } 
            $featuresIds[$favData->vehicleItemId] = $feature->getId(); 
        } 
 
        return $featuresIds; 
    } 
}