<?php

namespace App\Controller;

use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Requirement\Requirement;
use Symfony\Component\Routing\Attribute\Route;

use App\Repository\EventRepository;
use App\Entity\Event;
use App\Entity\Gamemaster;

use App\Security\Voter\EventAccessVoter;

final class PrepareController extends AbstractController
{
    #[Route('/prepare', name: 'app_prepare')]
    public function prepare(EventRepository $repository): Response
    {
        // Faut être au moins du STAFF
        $this->denyAccessUnlessGranted('ROLE_STAFF');

        // La personne connectée est-elle un MJ ?
        $gamemaster = null;
        $user = $this->getUser();
        if (in_array('ROLE_STAFF', $user->GetRoles())) {
            // C'est un membre du staff, on check son profil MJ
            $gamemaster = $user->getLinkToGamemaster();
            if (!$gamemaster) {
                // Mais c'est pas un MJ
                $this->addFlash('danger', 'Seuls les MJ de l\'équipe peuvent préparer un événement');
                return $this->redirectToRoute('app_main');
            }
        }

        // Tous événement même non publiés à venir
        $events = $repository->findEventsToPrepare($gamemaster);

        if (count($events) < 1) {
            // Aucun événement à préparer
            $this->addFlash('info', 'Aucun événement en cours de préparation pour le moment.');
            return $this->redirectToRoute('app_main');
        }

        $event = $events[0];

        return $this->render('prepare/prepare.html.twig', [
            'event' => $event,
            'events' => $events
        ]);
    }

    #[Route('/prepare/{id}', name: 'app_prepare_planning', requirements: ['id' => Requirement::UUID_V7], methods: ['GET', 'POST'])]
    public function preparePlanning(?Event $event, EventRepository $repository): Response
    {
        // Si pas d'événement, ça dégage
        if (!$event) {
            $this->addFlash('danger', 'Événement inconnu !');
            return $this->redirectToRoute('app_prepare');
        }

        // On controle les droits d'accès sur l'événement
        $this->denyAccessUnlessGranted(EventAccessVoter::ACCESS_EVENT, $event);

        // La personne connectée est-elle un MJ ?
        $gamemaster = null;
        $user = $this->getUser();
        if (in_array('ROLE_STAFF', $user->GetRoles())) {
            // C'est un membre du staff, on check son profil MJ
            $gamemaster = $user->getLinkToGamemaster();
            if (!$gamemaster) {
                // Mais c'est pas un MJ
                $this->addFlash('danger', 'Seuls les MJ de l\'équipe peuvent préparer un événement');
                return $this->redirectToRoute('app_main');
            }
        }

        // Tous événement même non publiés à venir
        $events = $repository->findEventsToPrepare($gamemaster);

        if (count($events) < 1) {
            // Aucun événement à préparer
            $this->addFlash('danger', 'Aucun événement en cours de préparation pour le moment.');
            return $this->redirectToRoute('app_main');
        }

        return $this->render('prepare/prepare.html.twig', [
            'event' => $event,
            'events' => $events
        ]);
    }
}
