const apiConfig = require('../config/api.js');

/**
 * 封装的HTTP请求工具
 */
class Request {
  constructor() {
    this.baseURL = apiConfig.baseURL;
    this.timeout = apiConfig.timeout;
  }

  /**
   * 发送HTTP请求
   * @param {Object} options 请求配置
   * @returns {Promise} 请求结果
   */
  request(options) {
    return new Promise((resolve, reject) => {
      // 获取存储的token
      const token = wx.getStorageSync('token');
      
      // 构建请求头
      const header = {
        'Content-Type': 'application/json',
        ...options.header
      };
      
      // 如果有token，添加到请求头
      if (token) {
        header['Authorization'] = `Bearer ${token}`;
      }
      
      // 构建完整URL
      const url = options.url.startsWith('http') 
        ? options.url 
        : `${this.baseURL}${options.url}`;
      
      // 发送请求
      wx.request({
        url,
        method: options.method || 'GET',
        data: options.data || {},
        header,
        timeout: this.timeout,
        success: (res) => {
          console.log('API请求成功:', url, res);
          
          // 处理HTTP状态码
          if (res.statusCode >= 200 && res.statusCode < 300) {
            // 处理业务状态码
            if (res.data && res.data.code !== undefined) {
              if (res.data.code === 200 || res.data.code === 0) {
                resolve(res.data);
              } else {
                // 业务错误
                this.handleBusinessError(res.data);
                reject(res.data);
              }
            } else {
              // 没有业务状态码，直接返回数据
              resolve(res.data);
            }
          } else {
            // HTTP错误
            this.handleHttpError(res);
            reject(res);
          }
        },
        fail: (err) => {
          console.error('API请求失败:', url, err);
          this.handleNetworkError(err);
          reject(err);
        }
      });
    });
  }

  /**
   * GET请求
   */
  get(url, data = {}, options = {}) {
    return this.request({
      url,
      method: 'GET',
      data,
      ...options
    });
  }

  /**
   * POST请求
   */
  post(url, data = {}, options = {}) {
    return this.request({
      url,
      method: 'POST',
      data,
      ...options
    });
  }

  /**
   * PUT请求
   */
  put(url, data = {}, options = {}) {
    return this.request({
      url,
      method: 'PUT',
      data,
      ...options
    });
  }

  /**
   * DELETE请求
   */
  delete(url, data = {}, options = {}) {
    return this.request({
      url,
      method: 'DELETE',
      data,
      ...options
    });
  }

  /**
   * 处理业务错误
   */
  handleBusinessError(data) {
    const message = data.message || '请求失败';
    
    // 特殊错误码处理
    switch (data.code) {
      case 401:
        // 未授权，清除token并跳转登录
        wx.removeStorageSync('token');
        wx.removeStorageSync('userInfo');
        wx.showToast({
          title: '登录已过期，请重新登录',
          icon: 'none'
        });
        setTimeout(() => {
          wx.reLaunch({
            url: '/pages/login/login'
          });
        }, 1500);
        break;
      case 403:
        wx.showToast({
          title: '权限不足',
          icon: 'none'
        });
        break;
      default:
        wx.showToast({
          title: message,
          icon: 'none'
        });
    }
  }

  /**
   * 处理HTTP错误
   */
  handleHttpError(res) {
    let message = '网络请求失败';
    
    switch (res.statusCode) {
      case 400:
        message = '请求参数错误';
        break;
      case 401:
        message = '未授权访问';
        break;
      case 403:
        message = '禁止访问';
        break;
      case 404:
        message = '请求地址不存在';
        break;
      case 500:
        message = '服务器内部错误';
        break;
      case 502:
        message = '网关错误';
        break;
      case 503:
        message = '服务不可用';
        break;
      case 504:
        message = '网关超时';
        break;
    }
    
    wx.showToast({
      title: message,
      icon: 'none'
    });
  }

  /**
   * 处理网络错误
   */
  handleNetworkError(err) {
    let message = '网络连接失败';
    
    if (err.errMsg) {
      if (err.errMsg.includes('timeout')) {
        message = '请求超时';
      } else if (err.errMsg.includes('fail')) {
        message = '网络连接失败';
      }
    }
    
    wx.showToast({
      title: message,
      icon: 'none'
    });
  }
}

// 创建实例
const request = new Request();

module.exports = request;