
import { supabase } from "@/integrations/supabase/client";
import { clearSearchParams } from "./urlUtils";
import { redirectToFirstTripOrDashboard } from "@/services/redirectService";

/**
 * Verifies an invitation token against Supabase
 */
export async function verifyInviteToken(email: string, token: string) {
  try {
    const { data, error } = await supabase.auth.verifyOtp({
      email,
      token,
      type: 'invite'
    });

    if (error) {
      return {
        success: false,
        error: error.message.includes('expired')
          ? "Le lien d'invitation a expiré. Veuillez demander une nouvelle invitation."
          : `Erreur de vérification: ${error.message}`
      };
    }

    return { success: true };
  } catch (e) {
    console.error('❌ Exception lors de la vérification du token:', e);
    return {
      success: false,
      error: "Erreur lors de la vérification de l'invitation"
    };
  }
}

/**
 * Checks if an email exists in the Supabase auth system
 */
export async function checkEmailExists(email: string) {
  try {
    const { data, error } = await supabase.auth.signInWithOtp({
      email,
      options: {
        shouldCreateUser: false
      }
    });

    return !error || error.message !== "Email not found";
  } catch (error) {
    console.error('❌ Erreur lors de la vérification de l\'utilisateur:', error);
    return false;
  }
}

/**
 * Gets user profile information by email
 */
export async function getUserProfile(email: string) {
  try {
    const { data: profileData } = await supabase
      .from('profiles_safe')
      .select('name')
      .eq('email', email)
      .maybeSingle();

    return profileData?.name || '';
  } catch (e) {
    console.warn('Impossible de récupérer le nom de l\'utilisateur');
    return '';
  }
}

/**
 * Signs up a new user
 */
export async function signupUser(email: string, password: string, name: string) {
  const { data, error } = await supabase.auth.signUp({
    email,
    password,
    options: {
      data: {
        name,
        role: "planner",
      },
    },
  });

  if (error) {
    throw error;
  }

  return {
    ...data,
    requiresEmailConfirmation: Boolean(data.user && !data.session),
  };
}

/**
 * Resends the official Supabase signup confirmation email.
 */
export async function resendSignupConfirmation(email: string) {
  const { error } = await supabase.auth.resend({
    type: "signup",
    email,
  });

  if (error) {
    throw error;
  }
}

/**
 * Logs in an existing user
 */
export async function loginUser(email: string, password: string, navigate: (path: string) => void) {
  console.group('🔑 Tentative de connexion');
  console.info('Email:', email);

  try {
    const { data, error } = await supabase.auth.signInWithPassword({
      email,
      password,
    });

    if (error) {
      throw error;
    }

    console.info('✅ Connexion réussie pour l\'utilisateur invité');
    await redirectToFirstTripOrDashboard(navigate);
    return true;
  } catch (error: unknown) {
    console.error("❌ Erreur de connexion:", error);
    return false;
  } finally {
    console.groupEnd();
  }
}

/**
 * Updates a user's password
 */
export async function setUserPassword(password: string, email: string, navigate: (path: string) => void) {
  console.group('🔑 Configuration du mot de passe');
  console.info('Email invité:', email);

  try {
    if (!email) {
      throw new Error("Email de l'invitation manquant");
    }

    console.info('Définition du mot de passe');

    const { error } = await supabase.auth.updateUser({ password });

    if (error) {
      throw error;
    }

    console.info('✅ Mot de passe défini avec succès');
    await supabase.auth.getSession();

    const { data: acceptance, error: acceptanceError } =
      await supabase.functions.invoke('user-signup-handler', { body: {} });
    if (acceptanceError || !acceptance?.success) {
      throw new Error("L’invitation n’a pas pu être associée au voyage. Veuillez réessayer.");
    }

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

    clearSearchParams(navigate);

    console.info('✅ Session récupérée avec succès');

    // The redirect service resolves the role from the server-owned profile.
    await redirectToFirstTripOrDashboard(navigate);
    return true;
  } catch (error: unknown) {
    console.error("❌ Erreur:", error);
    if (error instanceof Error) {
      if (error.message?.includes("expired")) {
        navigate('/login');
        return false;
      }
    }
    if (!(error instanceof Error) || !error.message?.includes("expired")) {
      navigate('/login');
    }
    return false;
  } finally {
    console.groupEnd();
  }
}
