<?php
namespace App\EventSubscriber\Tournament;
use App\Entity\Notification;
use App\Entity\Phase;
use App\Event\Tournament\TournamentStartedEvent;
use App\Helper\PhaseHelper;
use DateTimeImmutable;
use Doctrine\ORM\EntityManagerInterface;
use LogicException;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
class TournamentStartedEventSubscriber implements EventSubscriberInterface
{
public function __construct(private EntityManagerInterface $entityManager)
{
}
public function onTournamentStartedEvent(TournamentStartedEvent $tournamentStartedEvent): void
{
$tournament = $tournamentStartedEvent->getTournament();
$players = $tournament->getPlayers()->toArray();
if (empty($players)) {
throw new LogicException('A tournament cannot be players-less.');
}
/** @var Phase $currentPhase */
$currentPhase = $tournament->getPhases()->first();
// at this state, the first created phase is the current tournament phase
$tournament->setCurrentPhase($tournament->getPhases()->first());
// shuffle player on first phase
shuffle($players);
PhaseHelper::generatePhaseContests($tournament->getCurrentPhase(), $players);
foreach ($tournament->getPlayers() as $player) {
$player->addNotification(
(new Notification())
->setType(Notification::TOURNAMENT_STARTED)
->setMessage(sprintf(
"%s commence ! 🥳 C'est le moment de montrer vos talents de surdoué.e 😎",
$tournament->getName()
))
->setExtraData(['tournamentId' => $tournament->getId()])
);
}
// starts the phase
$currentPhase
->setStatus(Phase::STARTED_STATUS)
->setStartedAt(new DateTimeImmutable())
;
$this->entityManager->flush();
}
public static function getSubscribedEvents(): array
{
return [
TournamentStartedEvent::class => 'onTournamentStartedEvent',
];
}
}