<?php
namespace App\EventSubscriber;
use App\Event\ModeEvent;
use App\Model\Mode;
use App\Service\Internal\NetworkService;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
class ModeSubscriber implements EventSubscriberInterface
{
/**
* @var NetworkService
*/
protected $networkService;
public function __construct(NetworkService $networkService)
{
$this->networkService = $networkService;
}
public static function getSubscribedEvents(): array
{
return [
ModeEvent::NAME => [
['setNetworkInfos', 4],
['getLayoutModes', 3],
['getDefaultModes', 2],
['buildExcludedModes', 1],
['getIsochroneLayoutModes', 0]
]
];
}
public function setNetworkInfos(ModeEvent $event)
{
$event->setNetworkInfos($this->networkService->getNetwork());
}
public function getLayoutModes(ModeEvent $event)
{
$modesLayout = [];
$networkInfos = $event->getNetworkInfos();
if (!empty($networkInfos['networks'][0]['itineraryResultLayout']['standard'])) {
$modesLayout = $networkInfos['networks'][0]['itineraryResultLayout']['standard'];
}
$event->setLayoutModes($modesLayout);
}
public function getDefaultModes(ModeEvent $event)
{
$defaultModes = [];
$networkInfos = $event->getNetworkInfos();
if (!empty($networkInfos['networks'][0]['modes'])) {
$defaultModes = array_diff($networkInfos['networks'][0]['modes'], Mode::NOT_REALLY_MODES);
}
$event->setDefaultModes($defaultModes);
}
/**
* @throws \Exception
*/
public function buildExcludedModes(ModeEvent $event)
{
$selectedModesByUserForGivenJourney = $event->getSelectedModesByUserForGivenJourney();
$excludedModes = $event->getDefaultExcludedModesUserPreferences();
if (null !== $selectedModesByUserForGivenJourney) {
$defaultModes = $event->getDefaultModes();
$excludedModes = array_diff($defaultModes, $selectedModesByUserForGivenJourney);
}
$event->setExcludedModes(array_values($excludedModes));
}
public function getIsochroneLayoutModes(ModeEvent $event)
{
$networkInfos = $event->getNetworkInfos();
$isochronesLayoutModes = $networkInfos['networks'][0]['layouts']['isochroneLayout'] ?? [];
$event->setIsochroneLayoutModes($isochronesLayoutModes);
}
}