
import { useEffect, useRef, useState } from "react";
import { useNavigate } from "react-router-dom";
import { toast } from "sonner";
import { SignupFormData, PasswordSetFormData } from "@/components/auth/schemas";
import { loginUser, resendSignupConfirmation, setUserPassword, signupUser } from "@/utils/authUtils";

export function useAuthFormSubmit(isInvitedUser: boolean) {
  const [isSubmitting, setIsSubmitting] = useState(false);
  const [confirmationEmail, setConfirmationEmail] = useState<string | null>(null);
  const [isResending, setIsResending] = useState(false);
  const [resendCooldown, setResendCooldown] = useState(0);
  const resendInFlightRef = useRef(false);
  const navigate = useNavigate();

  useEffect(() => {
    if (resendCooldown === 0) return;

    const timer = window.setTimeout(() => {
      setResendCooldown((seconds) => Math.max(0, seconds - 1));
    }, 1000);

    return () => window.clearTimeout(timer);
  }, [resendCooldown]);

  // Handle signup
  async function onSignup(values: SignupFormData) {
    setIsSubmitting(true);
    console.group('🔐 Tentative d\'inscription/connexion');
    console.info('Données soumises:', {...values, password: '********'});
    console.info('Utilisateur invité:', isInvitedUser);

    try {
      if (isInvitedUser) {
        console.info('Connexion d\'un utilisateur déjà invité');
        const success = await loginUser(values.email, values.password, navigate);
        if (success) toast.success("Connexion réussie !");
        else toast.error("Identifiants incorrects");
      } else {
        console.info('Inscription d\'un nouvel utilisateur');
        const signup = await signupUser(values.email, values.password, values.name);

        console.info('✅ Inscription réussie');
        if (signup.requiresEmailConfirmation) {
          setConfirmationEmail(values.email);
          return;
        }

        toast.success("Compte créé avec succès !");

        localStorage.setItem('firstLogin', 'true');

        navigate("/login");
      }
    } catch (error: unknown) {
      console.error("❌ Erreur:", error);
      if (error instanceof Error && error.message.includes("already registered")) {
        console.warn('⚠️ L\'utilisateur existe déjà, suggestion de connexion');
        toast.error("Un compte existe déjà avec cette adresse email. Connectez-vous plutôt.");
        navigate("/login", { state: { email: values.email } });
        return;
      }

      if (error instanceof Error) {
        toast.error(`Erreur: ${error.message}`);
      } else {
        toast.error("Erreur lors de la création du compte");
      }
    } finally {
      setIsSubmitting(false);
      console.groupEnd();
    }
  }

  async function onResendConfirmation() {
    if (!confirmationEmail || resendInFlightRef.current || resendCooldown > 0) return;

    resendInFlightRef.current = true;
    setIsResending(true);
    try {
      await resendSignupConfirmation(confirmationEmail);
      setResendCooldown(60);
      toast.success("Un nouvel email de confirmation vient de vous être envoyé.");
    } catch (error) {
      console.error("❌ Erreur lors du renvoi de l’email de confirmation:", error);
      toast.error("L’email de confirmation n’a pas pu être renvoyé. Veuillez réessayer plus tard.");
    } finally {
      resendInFlightRef.current = false;
      setIsResending(false);
    }
  }

  // Handle setting password
  async function onSetPassword(values: PasswordSetFormData, invitedEmail: string) {
    setIsSubmitting(true);
    try {
      const success = await setUserPassword(values.password, invitedEmail, navigate);
      if (success) toast.success("Compte activé !");
      else toast.error("Erreur lors de l'activation du compte");
    } finally {
      setIsSubmitting(false);
    }
  }

  return {
    isSubmitting,
    confirmationEmail,
    isResending,
    resendCooldown,
    onSignup,
    onResendConfirmation,
    onSetPassword
  };
}
