import { ref } from 'vue';

/**
 * 通用错误处理钩子
 * 用于处理API请求和其他异步操作中的错误
 * @returns 包含错误状态和处理方法的对象
 */
export function useErrorHandler() {
  const error = ref<Error | null>(null);
  const isLoading = ref(false);

  /**
   * 重置错误状态
   */
  function resetError() {
    error.value = null;
  }

  /**
   * 处理错误并更新状态
   * @param err - 捕获到的错误
   */
  function handleError(err: unknown) {
    if (err instanceof Error) {
      error.value = err;
    } else if (typeof err === 'string') {
      error.value = new Error(err);
    } else {
      error.value = new Error('发生未知错误');
    }
    isLoading.value = false;
    console.error('错误:', error.value);
  }

  /**
   * 包装异步函数以自动处理错误
   * @param asyncFn - 需要执行的异步函数
   * @returns 包装后的异步函数
   */
  async function wrapAsync<T>(asyncFn: () => Promise<T>): Promise<T | null> {
    try {
      isLoading.value = true;
      resetError();
      const result = await asyncFn();
      return result;
    } catch (err) {
      handleError(err);
      return null;
    } finally {
      isLoading.value = false;
    }
  }

  return {
    error,
    isLoading,
    resetError,
    handleError,
    wrapAsync
  };
} 