import { useMutation } from '@tanstack/react-query';

import { medusaLoginOrRegister } from '../../../features/medusa-storefront/src/lib/data/customer';
import { useSupabase } from './use-supabase';

interface Credentials {
  email: string;
  password: string;
  emailRedirectTo: string;
  captchaToken?: string;
}

export function useSignUpWithEmailAndPassword() {
  const client = useSupabase();
  const mutationKey = ['auth', 'sign-up-with-email-password'];

  const mutationFn = async (params: Credentials) => {
    const { emailRedirectTo, captchaToken, ...credentials } = params;

    // TODO?: should be a validation of unique personal code before registration
    const response = await client.auth.signUp({
      ...credentials,
      options: {
        emailRedirectTo,
        captchaToken,
      },
    });

    if (response.error) {
      throw response.error.message;
    }

    const user = response.data?.user;
    const identities = user?.identities ?? [];

    // if the user has no identities, it means that the email is taken
    if (identities.length === 0) {
      throw new Error('User already registered');
    }

    if ('email' in credentials) {
      try {
        const medusaAccountId = await medusaLoginOrRegister({
          email: credentials.email,
          password: credentials.password,
          isDevPasswordLogin: true,
        });
        await client
          .schema('medreport')
          .from('accounts')
          .update({ medusa_account_id: medusaAccountId })
          .eq('primary_owner_user_id', user!.id)
          .eq('is_personal_account', true);
      } catch (error) {
        await client.auth.signOut();
        throw error;
      }
    }

    return response.data;
  };

  return useMutation({
    mutationKey,
    mutationFn,
  });
}
