<?php
namespace App\BusApi;
use App\Entity\Bus\Route;
use App\Entity\Bus\RouteFareRule;
use App\Entity\Bus\Seat;
use App\Entity\Bus\Stop;
use App\Entity\Bus\Trip;
use App\Entity\Station;
use App\Entity\Vehicle;
use DateTime;
use DateTimeImmutable;
use Doctrine\Persistence\ManagerRegistry;
use Doctrine\Persistence\ObjectManager;
use FOS\RestBundle\Controller\AbstractFOSRestController;
use JMS\Serializer\SerializationContext;
use JMS\Serializer\SerializerBuilder;
use Mpdf\Output\Destination;
use Mpdf\Tag\Tr;
use PhpOffice\PhpSpreadsheet\Calculation\Financial\Securities\Price;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\RequestStack;
use Symfony\Component\HttpFoundation\Response;
use FOS\RestBundle\Controller\Annotations as Rest;
class TripController extends AbstractFOSRestController
{
private ManagerRegistry $registry;
private ObjectManager $entityManager;
private RequestStack $requestStack;
public function __construct(ManagerRegistry $registry, RequestStack $requestStack)
{
$this->entityManager = $registry->getManager();
$this->requestStack = $requestStack;
}
/**
* @Rest\Get("/", name="passengerTrips")
*/
public function tripsHome(Request $request)
{
$em = $this->entityManager;
$date = $request->get('trip_date');
$today = new DateTimeImmutable();
if (!$date) {
$date = $today->format('Y-m-d');
}
/** @var Trip[] $trips */
$trips = $em->getRepository(Trip::class)->findTrips($date, 'MAIN');
$data = [
"trips" => $trips
];
return new JsonResponse($data, Response::HTTP_OK);
}
/**
* @Rest\Get("/trips", name="tripSearch")
*/
public function tripsSearch(Request $request): Response
{
$em = $this->entityManager;
$serializer = SerializerBuilder::create()->build();
$context = new SerializationContext();
$context->setSerializeNull(true)->enableMaxDepthChecks();
$date = $request->get('date');
$origin = $request->get('from');
$destination = $request->get('to');
$originDestination = $em->getRepository(Station::class)->findStops($origin, $destination);
$requestedRoute = $em->getRepository(Stop::class)->findRouteByOriginAndDestination($origin, $destination);
$route = $em->getRepository(Route::class)->findOneBy([
'id' => $requestedRoute['route_id']
]);
$em->beginTransaction();
try {
$trips = $em->getRepository(Trip::class)->findTripsByDate($date, $destination, $origin);
if (!$trips) {
$fromStation = $em->getRepository(Stop::class)->findOneBy([
'station' => $origin,
'route' => $route
]);
$toStation = $em->getRepository(Stop::class)->findOneBy([
'station' => $destination,
'route' => $route
]);
$pricing = $em->getRepository(RouteFareRule::class)->findOneBy([
'route' => $route,
]);
$vehicle = $em->getRepository(Vehicle::class)->findOneBy([
'id' => 2112
]);
$trips = null;
// $tDate = new \DateTime($date);
try {
$dateB = new \DateTime($date);
} catch (\Exception $e) {
return $this->json(['error' => 'Invalid date format'], 400);
}
$trip = new Trip();
$trip->setOrigin($route->getOrigin());
$trip->setDestination($route->getDestination());
$trip->setRoute($route);
$trip->setCreatedAt(new \DateTime());
$trip->setTripDate($dateB);
$trip->setFare($pricing->getNormalFare());
$trip->setTripIndex(0);
$trip->setEta($toStation->getEta());
$trip->setVehicleIsApproved(false);
$trip->setDepartureTime($fromStation->getDepartureTime());
$trip->setVehicle($vehicle);
$seat = [];
for ($i = 1; $i <= $vehicle->getPassengerCapacity(); $i++) {
$seat = new Seat();
$seat->setStatus('AVAILABLE');
$seat->setSeatNumber($i);
$seat->setTrip($trip);
$seat->setIsBooked(false);
$seat->setCreatedAt(new DateTime());
$em->persist($seat);
}
$em->persist($trip);
$em->flush();
$trips = $em->getRepository(Trip::class)->findTripsByDate($date, $destination, $origin);
}
$em->commit();
} catch (\Throwable $e) {
$em->rollback();
throw $e;
}
$data = [
"from_to" => $originDestination,
"trips" => $trips
];
$data = $serializer->serialize($data, 'json', $context);
// dump($trips);die;
return new Response($data, Response::HTTP_OK);
}
/**
* @Rest\Get("/trips/{trip}", name="oneTripSearch")
*/
public function trip(Request $request, $trip)
{
$em = $this->entityManager;
$trip = $em->getRepository(Trip::class)->findOneBy([
'id' => $trip
]);
$serializer = SerializerBuilder::create()->build();
$context = new SerializationContext();
$context->setSerializeNull(true)
->enableMaxDepthChecks();
$data = $serializer->serialize($trip, 'json', $context);
return new Response($data, Response::HTTP_OK);
}
}