<?php
namespace App\EventSubscriber;
use App\Event\JourneyEvent;
use App\Event\ModeEvent;
use App\Model\Mode;
use App\Normalizer\DisruptionNormalizer;
use App\Normalizer\JourneyGroupNormalizer;
use App\Service\Internal\DisruptionService;
use App\Service\Internal\JourneyService;
use App\Service\Internal\LogService;
use Symfony\Component\EventDispatcher\EventDispatcherInterface;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
class JourneySubscriber implements EventSubscriberInterface
{
/**
* @var EventDispatcherInterface
*/
protected $eventDispatcher;
/**
* @var JourneyService
*/
protected $journeyService;
/** @var DisruptionService */
protected $disruptionService;
/**
* @var LogService
*/
protected $logService;
/**
* @var string
*/
protected $networkId;
/**
* @var JourneyGroupNormalizer
*/
protected $journeyGroupNormalizer;
protected DisruptionNormalizer $disruptionNormalizer;
public function __construct(
EventDispatcherInterface $eventDispatcher,
JourneyService $journeyService,
DisruptionService $disruptionService,
LogService $logService,
string $networkId,
JourneyGroupNormalizer $journeyGroupNormalizer,
DisruptionNormalizer $disruptionNormalizer
) {
$this->eventDispatcher = $eventDispatcher;
$this->journeyService = $journeyService;
$this->disruptionService = $disruptionService;
$this->logService = $logService;
$this->networkId = $networkId;
$this->journeyGroupNormalizer = $journeyGroupNormalizer;
$this->disruptionNormalizer = $disruptionNormalizer;
}
public static function getSubscribedEvents(): array
{
return [
JourneyEvent::NAME => [
['journeyCalculation', 0]
]
];
}
public function journeyCalculation(JourneyEvent $event)
{
$bodyRequest = $event->getBodyRequest();
$userModes = [];
if (isset($bodyRequest['modes'])) {
$userModes = $bodyRequest['modes'];
unset($bodyRequest['modes']);
}
$modeEvent = new ModeEvent($userModes);
$this->eventDispatcher->dispatch($modeEvent, ModeEvent::NAME);
$bodyRequest['excludedModes'] = $modeEvent->getExcludedModes();
$totalNumberJourneys = 0;
$journeys = [];
$layoutModes = isset ($bodyRequest['layoutMode']) ? [$bodyRequest['layoutMode']] : $modeEvent->getLayoutModes();
$isSubNetworks = '';
$departureDateTime = $bodyRequest['departureDateTime'] ?? null;
$atDateTimeFormated = $this->disruptionNormalizer->setAtDateTime($departureDateTime);
$currentDisruptions = $this->disruptionService->getDisruptions($isSubNetworks, DisruptionNormalizer::STATUS_ONGOING, $atDateTimeFormated);
$disruptions = $currentDisruptions['disruptions'] ?? [];
foreach ($layoutModes as $layout) {
$layoutTotalJourneys = 0;
$journeys[$layout] = $this->journeyService->getJourneysByLayoutMode($layout, $bodyRequest);
if (isset($journeys[$layout]['groups'])) {
$layoutTotalJourneys = $this->getTotalNumberJourneysByLayoutMode($journeys[$layout]['groups']);
$totalNumberJourneys += $layoutTotalJourneys;
$journeys[$layout] = $this->journeyGroupNormalizer->normalize($layout, $journeys[$layout], $disruptions);
}
if (Mode::TAB_TRANSPORT === $layout && 0 === $layoutTotalJourneys) {
$wsUrl = preg_replace(
['/%1/', '/%2/'],
[$this->networkId, $layout],
JourneyService::PATH_JOURNEYS_BY_LAYOUT_MODE
);
$this->logService->sendLog($wsUrl, JourneyService::LOG_NO_JOURNEYS_FOUND);
}
}
$event->setJourneyResults($journeys);
$event->setTotalNumberJourneys($totalNumberJourneys);
}
public function getTotalNumberJourneysByLayoutMode(array $journeysGroup): int
{
$total = 0;
foreach ($journeysGroup as $group) {
if (isset($group['results']['journeycount'])) {
$total += $group['results']['journeycount'];
}
}
return $total;
}
}