<?php

namespace App\Security;

use App\Entity\Account;
use App\Entity\Customer;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\HttpFoundation\RedirectResponse;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorageInterface;
use Symfony\Component\Security\Core\Exception\AuthenticationException;
use Symfony\Component\Security\Http\EntryPoint\AuthenticationEntryPointInterface;

class AuthenticationEntryPoint implements AuthenticationEntryPointInterface
{
    public function __construct(
        private readonly UrlGeneratorInterface $urlGenerator,
        private readonly TokenStorageInterface $tokenStorage
    ) {}

    public function start(Request $request, ?AuthenticationException $authException = null): Response
    {
        $token = $this->tokenStorage->getToken();
        $user = $token ? $token->getUser() : null;
        $path = $request->getPathInfo();

        // 1. Gestion des appels API / AJAX
        if (in_array('application/json', $request->getAcceptableContentTypes())) {
            return new JsonResponse(['error' => 'Accès restreint'], Response::HTTP_FORBIDDEN);
        }

        // 2. LOGIQUE POUR LE CRM (/crm)
        // Seuls les objets Account (Admins) sont autorisés
        if (str_starts_with($path, '/crm')) {
            if ($user instanceof Customer) {
                // Un client tente d'entrer dans le CRM -> Redirection Accueil
                return new RedirectResponse($this->urlGenerator->generate('app_home'));
            }
            // Si pas connecté du tout -> Redirection Login Admin (app_home dans ton cas)
            return new RedirectResponse($this->urlGenerator->generate('app_home'));
        }

        // 3. LOGIQUE POUR LA RÉSERVATION (/reservation)
        // On autorise Account ET Customer
        if (str_starts_with($path, '/reservation')) {
            // Si l'utilisateur est un Account ou un Customer, il a le droit d'être ici
            // Le contrôle d'accès (AccessControl) fera le reste.
            // Si personne n'est connecté, on envoie vers le login client
            if (!$user) {
                return new RedirectResponse($this->urlGenerator->generate('reservation_login'));
            }
        }

        // Par défaut, retour à l'accueil
        return new RedirectResponse($this->urlGenerator->generate('app_home'));
    }
}
