<?php
namespace App\Controller\Front;
use Throwable;
use App\Controller\PageController;
use App\Form\VehicleType;
use App\Model\Appointment;
use App\Model\Client;
use App\Model\Vehicle;
use App\Repository\MenuRepository;
use App\Service\AppointmentService;
use App\Service\ValidatorService;
use App\Service\VehicleService;
use Doctrine\Persistence\ManagerRegistry;
use Psr\Log\LoggerInterface;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\ParamConverter;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\Serializer\SerializerInterface;
/**
* @Route("/vehicle", priority="1", options={"expose"=true})
*/
class VehicleController extends PageController
{
use SecurityTokenTrait;
private VehicleService $vehicleService;
private LoggerInterface $logger;
public function __construct(ManagerRegistry $doctrine, MenuRepository $menuRepository, VehicleService $vehicleService, LoggerInterface $logger)
{
parent::__construct($doctrine, $menuRepository);
$this->vehicleService = $vehicleService;
$this->logger = $logger;
}
/**
* @Route("/all", name="all_vehicles")
*/
public function vehicles(): JsonResponse
{
try {
$vehicles = $this->vehicleService->all();
} catch (Throwable $exception) {
return $this->json([
'message' => $exception->getMessage(),
], Response::HTTP_INTERNAL_SERVER_ERROR);
}
return $this->json([
'cars' => $vehicles,
]);
}
/**
* @Route("/delete/{id}", name="vehicle_delete")
*
* @return JsonResponse
*/
public function delete(Request $request, string $id, AppointmentService $appointmentService): Response
{
$session = $request->getSession();
/** @var Client $user */
$user = $this->getUser();
$isUserConnected = $user && !$session->get('gon');
$vehicles = $appointmentService->deleteAppointmentVehicle($id, $isUserConnected, $session);
/** @var Appointment $appointment */
$appointment = $session->get('appointment');
if ($appointment->getVehicle() && $appointment->getVehicle()->getId() == $id) {
$appointment->setVehicle(null);
$appointmentService->removeNextStep($appointment, 'vehicle');
}
return $this->json([
'success' => true,
'data' => [
'html' => $this->renderView('olivier/elements/block_accordion_cars.html.twig', [
'vehicles' => $vehicles,
]),
],
]);
}
/**
* @Route("/{id}", name="appointment_vehicle", defaults={"id": null}, methods={"GET", "POST", "PUT"})
*
* @ParamConverter("selectedVehicle", class="App\Model\Vehicle")
*/
public function vehicle(Request $request, ?Vehicle $selectedVehicle, AppointmentService $appointmentService, ValidatorService $validator, VehicleService $vehicleService, SerializerInterface $serializer): Response
{
$session = $request->getSession();
/** @var Client $user */
$user = $this->getUser();
$isUserConnected = $user && !$session->get('gon');
$vehicles = $vehicleService->getVehicles($isUserConnected, $user, $serializer, $appointmentService, $session);
$currentStep = $request->query->get('currentStep', 2);
$maxStep = $request->query->get('maxStep', 2);
$session->set('maxStep', $maxStep);
$form = $this->createForm(VehicleType::class, $selectedVehicle);
$form->handleRequest($request);
if ($form->isSubmitted()) {
/*
* UPDATE/CREATE VEHICLE
*/
if (!$form->isValid()) {
$errors = $validator->getErrors($form);
$this->logger->error(json_encode($errors, JSON_THROW_ON_ERROR));
return $this->json([
'error' => $errors,
], Response::HTTP_INTERNAL_SERVER_ERROR);
}
$vehicleService->getOrderedVehicles($isUserConnected, $selectedVehicle, $vehicles);
if (!$isUserConnected) {
$session->set('vehicles', $vehicles);
}
$appointmentService->needReinitVehicleStep($request->getSession(), $selectedVehicle->getId());
return $this->json([
'success' => true,
'data' => [
'html' => $this->renderView('olivier/elements/block_accordion_cars.html.twig', [
'vehicles' => $vehicles,
]),
],
]);
}
/** @var Appointment $appointment */
$appointment = $session->get('appointment');
$selectedVehicle = null;
// Highlight vehicle by default if it already exists (ex of case: click on modify vehicle in resume step)
if ($appointment->getVehicle()) {
$appointmentService->addToVehicles($vehicles, $appointment->getVehicle());
$selectedVehicle = $appointment->getVehicle();
$session->set('vehicles', $vehicles);
}
return $this->json([
'success' => true,
'data' => [
'html' => $this->renderView('front/appointment/vehicle.html.twig', [
'maxStep' => $maxStep,
'currentStep' => $currentStep,
'vehicleForm' => $form->createView(),
'vehicles' => $vehicles,
'selectedVehicle' => $selectedVehicle,
'appointment' => $appointment
]),
],
]);
}
}