import { notifyError, notifySuccess } from 'src/helpers';
import { Ref } from 'vue';

export interface UseMutateOptions {
  onSuccess?: () => void;
  successMessage?: string;
  onError?: (error: any) => void;
  errorMessage?: string;
}

export function useMutate(fn: () => Promise<any>, loading?: Ref<boolean>, options: UseMutateOptions = {}) {
  const { onSuccess, onError, successMessage, errorMessage } = options;

  const mutate = async () => {
    if (loading) {
      loading.value = true;
    }
    try {
      const result = await fn();
      if (successMessage) notifySuccess(successMessage);
      if (onSuccess) onSuccess();
      return result;
    } catch (error) {
      if (errorMessage) notifyError(error, errorMessage);
      if (onError) onError(error);
      throw error;
    } finally {
      if (loading) {
        loading.value = false;
      }
    }
  };

  return { mutate };
}
