<?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\Entity\Game;
use Symfony\Component\HttpFoundation\RedirectResponse;

final class MainController extends AbstractController
{
    #[Route('/', name: 'app_main')]
    public function index(EventRepository $repository): Response
    {
        // Est-ce qu'un utilisateur est connecté et qu'il est au moins "staff" ?
        $user = $this->getUser();
        $onlyPublicAccess = true;
        if ($user) {
            $roles = $user->getRoles();
            if (in_array('ROLE_STAFF', $roles) || in_array('ROLE_MANAGER', $roles) || in_array('ROLE_ADMIN', $roles)) {
                $onlyPublicAccess = false;
            }
        }
        // Récupérer la liste des événements visibles
        $events = $repository->findEventsToCome($onlyPublicAccess);

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

    #[Route('/booking', name: 'app_main_booking_main')]
    public function bookingMain(EventRepository $repository): Response
    {

        // Est-ce qu'un utilisateur est connecté et qu'il est au moins "staff" ?
        $user = $this->getUser();
        $onlyPublicAccess = true;
        if ($user) {
            $roles = $user->getRoles();
            if (in_array('ROLE_STAFF', $roles) || in_array('ROLE_MANAGER', $roles) || in_array('ROLE_ADMIN', $roles)) {
                $onlyPublicAccess = false;
            }
        }
        // Récupérer la liste des événements visibles
        $events = $repository->findEventsToCome($onlyPublicAccess);
        if (!$events) {
            $this->addFlash('info', 'Aucun d\'événement n\'est plannifié pour le moment.');
            return $this->redirectToRoute('app_main');
        }
        $event = $events[0];
        
        return $this->redirectToRoute('app_main_booking', ['id' => $event->getId(), 'view' => 'pictures']);
    }
    


    #[Route('/booking/{id}/{view}', name: 'app_main_booking', requirements: ['id' => Requirement::UUID_V7, 'view' => '.*'], methods: ['GET', 'POST'])]
    public function booking(?Event $event, EventRepository $repository, string $view): Response
    {
        // Contrôler qu'un événement est bien ok
        if (!$event) {
            $this->addFlash('danger', 'Événement inconnu !');
            $this->redirectToRoute('app_main_booking_main');
        }

        // Est-ce qu'un utilisateur est connecté et qu'il est au moins "staff" ?
        $user = $this->getUser();
        $onlyPublicAccess = true;
        if ($user) {
            $roles = $user->getRoles();
            if (in_array('ROLE_STAFF', $roles) || in_array('ROLE_MANAGER', $roles) || in_array('ROLE_ADMIN', $roles)) {
                $onlyPublicAccess = false;
            }
        }
        
        // Est-ce qu'une vue est invoquée dans l'URL ? et est-ce une option valide ?
        if (!$view || !in_array($view, ['info', 'planning', 'pictures'])) {
            $view = 'pictures';
        }
        
        // Si le planning n'est pas affiché, planning et pictures -> info
        //if ($event.isHiddenPlanning()  
        
        // Récupérer la liste des événements visibles
        $events = $repository->findEventsToCome($onlyPublicAccess);

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

    #[Route('/charte-animations', name: 'app_code_of_conduct')]
    public function codeOfConduct(): Response
    {
        // Lire le contenu de la charte des animations depuis un fichier
        $codeContent = file_get_contents(__DIR__ . '/../../public/pages/code.md');

        return $this->render('main/markdown.html.twig', [
            'codeContent' => $codeContent,
        ]);
    }

    #[Route('/cgu', name: 'app_terms')]
    public function terms(): Response
    {
        // Lire le contenu de la charte des animations depuis un fichier
        $codeContent = file_get_contents(__DIR__ . '/../../public/pages/terms.md');

        return $this->render('main/markdown.html.twig', [
            'codeContent' => $codeContent,
        ]);
    }

    #[Route('/legal', name: 'app_legal')]
    public function legal(): Response
    {
        // Lire le contenu de la charte des animations depuis un fichier
        $codeContent = file_get_contents(__DIR__ . '/../../public/pages/legal.md');

        return $this->render('main/markdown.html.twig', [
            'codeContent' => $codeContent,
        ]);
    }

    #[Route('/contact', name: 'app_contact')]
    public function contact(): Response
    {
        // TODO: formulaire de contact avec envoi d'un mail
        // Lire le contenu de la charte des animations depuis un fichier
        $codeContent = file_get_contents(__DIR__ . '/../../public/pages/legal.md');

        return $this->render('main/markdown.html.twig', [
            'codeContent' => $codeContent,
        ]);
    }

    #[Route('/gamemaster/{id}', name: 'app_gamemaster_public_profile', requirements: ['id' => Requirement::UUID_V7], methods: ['GET'])]
    public function gamemasterPublicProfile(?Gamemaster $gamemaster): Response
    {
        if ($gamemaster) {
            return $this->render('main/_modal.gamemaster.html.twig', [
                'gamemaster' => $gamemaster,
            ]);
            
        } else {
            $this->addFlash('danger', 'Meneur(euse) de jeu inconnu(e).');
            return $this->redirectToRoute('app_main');
        }
    }
    
    #[Route('/game/{id}', name: 'app_game_public', requirements: ['id' => Requirement::UUID_V7], methods: ['GET'])]
    public function gamePublic(?Game $game): Response
    {
        if ($game) {
            return $this->render('main/_modal.game.html.twig', [
                'game' => $game,
            ]);
            
        } else {
            $this->addFlash('danger', 'Jeu inconnu.');
            return $this->redirectToRoute('app_main');
        }
    }
    
    
    // Gestion de la newsletter et des pièces jointes
    // ORGASSO permet uniquement de générer un template de newsletter, il ne gère pas l'envoi de celle-ci pour l'instant
    
    // Génération de la newsletter /newsletter/(annee)/(mois)
    #[Route('/newsletter/{year}/{month}', name: 'app_newsletter', requirements: ['year' => '\d{4}', 'month' => '0[1-9]|1[0-2]'], methods: ['GET'])]
    public function newsletter(EventRepository $repository, int $year, int $month): Response
    {
 
        // Lister tous les événements du mois et de l'année
        $events = $repository->findEventsOfMonth($month, $year, true);
        
        // Générer et retourner la newsletter
        return $this->render('main/mailing/simple.template.html.twig', ['events' => $events]);
    }
    
    // Génération de la newsletter d'un événement /newsletter/detail/(uuid)
    #[Route('/newsletter/detail/{id}', name: 'app_newsletter_detail', requirements: ['id' => Requirement::UUID_V7], methods: ['GET'])]
    public function newsletterDetail(?Event $event, EventRepository $repository): Response
    {
        // Contrôle qu'un événement est bien transmis
        if (!$event) {
            $this->addFlash('danger', 'Événement inconnu !');
            $this->redirectToRoute('app_main_booking_main');
        }
        return $this->render('main/mailing/detail.template.html.twig', ['event' => $event]);
    }
    
    // Génération des ICS pour la newsletter et l'affiche des événements
    #[Route('/ics/{id}.ics', name: 'app_main_ics', requirements: ['id' => Requirement::UUID_V7], methods: ['GET'])]
    public function ics(?Event $event, EventRepository $repository): Response
    {
        // Contrôler qu'un événement est bien ok
        if (!$event) {
            $this->addFlash('danger', 'Événement inconnu !');
            $this->redirectToRoute('app_main_booking_main');
        }
        return $this->render('main/event.ics.twig', ['event' => $event]);
    }

}
