/**
 * 错误处理工具类
 */

// 错误码映射表
const ERROR_CODE_MAP = {
  400: '请求参数错误',
  401: '登录已过期，请重新登录',
  403: '没有权限执行此操作',
  404: '请求的资源不存在',
  500: '服务器错误，请稍后重试',
  502: '网关错误',
  503: '服务不可用，请稍后重试',
  504: '网关超时'
};

// 业务错误码映射表（根据实际业务定义）
const BUSINESS_ERROR_CODE_MAP = {
  10001: '用户名或密码错误',
  10002: '账号已被禁用',
  10003: '验证码错误',
  10004: '操作过于频繁，请稍后再试',
  // 添加更多业务错误码...
};

class ErrorHandler {
  constructor() {
    // 记录最后显示的错误信息和时间，避免重复显示
    this.lastMessage = '';
    this.lastTime = 0;
  }
  
  /**
   * 显示错误提示
   * @param {string} message - 错误信息
   * @param {number} duration - 显示时长
   */
  showError(message, duration = 2000) {
    // 避免重复显示相同的错误提示
    if (this.lastMessage === message && Date.now() - this.lastTime < 3000) {
      return;
    }
    
    uni.showToast({
      title: message,
      icon: 'none',
      duration: duration
    });
    
    // 记录最后显示的错误信息和时间
    this.lastMessage = message;
    this.lastTime = Date.now();
  }
  
  /**
   * 处理HTTP错误
   * @param {number} statusCode - HTTP状态码
   * @param {Object} response - 响应对象
   * @returns {Error} - 格式化的错误对象
   */
  handleHttpError(statusCode, response) {
    const errorMsg = ERROR_CODE_MAP[statusCode] || `网络请求错误：${statusCode}`;
    this.showError(errorMsg);
    
    const error = new Error(errorMsg);
    error.code = statusCode;
    error.response = response;
    
    // 特殊处理401未授权错误
    if (statusCode === 401) {
      this.handleUnauthorized();
    }
    
    return error;
  }
  
  /**
   * 处理业务错误
   * @param {Object} data - 业务响应数据
   * @returns {Error} - 格式化的错误对象
   */
  handleBusinessError(data) {
    const errorMsg = BUSINESS_ERROR_CODE_MAP[data.code] || data.msg || '请求失败';
    this.showError(errorMsg);
    
    const error = new Error(errorMsg);
    error.code = data.code;
    error.data = data;
    
    return error;
  }
  
  /**
   * 处理网络请求失败
   * @param {Object} err - 原始错误对象
   * @returns {Error} - 格式化的错误对象
   */
  handleRequestFail(err) {
    let errorMsg = '网络请求失败，请检查网络连接';
    
    // 根据错误类型提供更具体的错误信息
    if (err.errMsg) {
      if (err.errMsg.includes('timeout')) {
        errorMsg = '请求超时，请检查网络连接';
      } else if (err.errMsg.includes('abort')) {
        errorMsg = '请求已取消';
      } else if (err.errMsg.includes('SSL')) {
        errorMsg = '网络安全证书错误';
      }
    }
    
    this.showError(errorMsg);
    
    const error = new Error(errorMsg);
    error.original = err;
    return error;
  }
  
  /**
   * 处理未授权错误（401）
   */
  handleUnauthorized() {
    // 清除登录信息
    uni.removeStorageSync('token');
    uni.removeStorageSync('userInfo');
    
    // 跳转到登录页
    setTimeout(() => {
      uni.navigateTo({
        url: '/pages/login/login'
      });
    }, 1500);
  }
  
  /**
   * 记录错误日志
   * @param {Error} error - 错误对象
   * @param {string} source - 错误来源
   */
  logError(error, source = 'unknown') {
    console.error(`[${source}] Error:`, error);
    
    // 这里可以添加错误上报逻辑
    // 例如发送到服务器或第三方监控平台
  }
}

// 创建单例
const errorHandler = new ErrorHandler();
export default errorHandler; 