import ora, { Ora } from "ora";

let globalSpinner: Ora | null = null;

export const getGlobalSpinner = () => globalSpinner;

export const withLoader = async <T>(
  message: string,
  fn: (updateMessage: (newMessage: string) => void, spinner?: Ora) => Promise<T>
): Promise<T> => {
  const spinner = ora(message).start();
  globalSpinner = spinner;
  
  const updateMessage = (newMessage: string) => {
    spinner.text = newMessage;
  };

  try {
    const result = await fn(updateMessage, spinner);
    spinner.succeed();
    globalSpinner = null;
    return result;
  } catch (error) {
    spinner.fail();
    globalSpinner = null;
    throw error;
  }
};
