import { Navigate } from 'react-router-dom';
import { useAuth } from '@/features/auth/hooks/useAuth';
import { useAuthStore } from '@/features/auth/store/authStore';
import { TokenStorage } from '@/services/tokenStorage';
import { useEffect, useState } from 'react';

interface ProtectedRouteProps {
  children: React.ReactNode;
}

/**
 * Composant de protection des routes authentifiées.
 * Redirige vers /login si l'utilisateur n'est pas authentifié.
 * Vérifie à la fois le store et le token dans localStorage pour éviter les problèmes de timing.
 */
export function ProtectedRoute({ children }: ProtectedRouteProps) {
  const { isAuthenticated, user } = useAuth();
  const [isChecking, setIsChecking] = useState(true);
  const hasToken = !!TokenStorage.getAccessToken();
  const { isLoading } = useAuthStore();

  useEffect(() => {
    // Donner un peu de temps pour que le store se hydrate
    const timer = setTimeout(() => {
      setIsChecking(false);
    }, 200);
    return () => clearTimeout(timer);
  }, []);

  // Si on vérifie encore ou si le store charge, attendre un peu
  if (isChecking || isLoading) {
    return null; // ou un spinner
  }

  // Vérifier à la fois le store et le token
  // Si le token existe mais le store n'est pas encore hydraté, on attend
  // Priorité: isAuthenticated du store > (hasToken && user)
  const isAuth = isAuthenticated || (hasToken && user);

  if (!isAuth) {
    return <Navigate to="/login" replace />;
  }

  return <>{children}</>;
}
