// 引入配置文件
import config from './config.js';

/**
 * 封装 uni.request 的通用请求方法
 * @param {Object} options - 请求选项
 * @param {string} options.url - 请求地址，可以是相对路径（会自动添加baseURL）或完整URL
 * @param {string} options.method - 请求方法，默认为GET
 * @param {Object} options.data - 请求数据
 * @param {Object} options.header - 自定义请求头，会与默认请求头合并
 * @param {boolean} options.loading - 是否显示加载提示，默认为false
 * @returns {Promise} - 返回Promise对象
 */
export default function request(options) {
  return new Promise((resolve, reject) => {
    // 开发环境使用mock数据
    if (process.env.NODE_ENV === 'development' && options.mock) {
      // 模拟微信登录接口
      if (options.url === '/auth/login') {
        return resolve({
          code: 200,
          data: {
            token: 'mock-token-123',
            openid: 'mock-openid',
            access_token: 'mock-access-token',
            userInfo: {
              nickName: '测试用户',
              avatarUrl: '/static/mock-avatar.png'
            }
          }
        })
      }
    }

    // 显示加载提示
    if (options.loading) {
      uni.showLoading({
        title: '加载中...'
      });
    }

    // 判断URL是否为完整URL（以http开头），如果不是则添加baseURL
    const url = options.url.startsWith('http') ? options.url : config.baseURL + options.url;
    
    // 合并默认请求头和自定义请求头
    const header = {
      ...config.headers,
      ...options.header
    };
    
    // 如果有token，添加到请求头
    const token = uni.getStorageSync('token');
    if (token) {
      header['Authorization'] = token;
    }
    
    // 发起请求
    uni.request({
      url: url,
      method: options.method || 'GET',
      data: options.data,
      header: header,
      timeout: options.timeout || config.timeout,
      success: (res) => {
        // 隐藏加载提示
        if (options.loading) {
          uni.hideLoading();
        }
        
        // 处理响应
        if (res.statusCode === 200) {
          // 业务状态码处理
          if (res.data.code === 200 || res.data.code === 0) {
            resolve(res.data);
          } else if (res.data.code === 401) {
            // 未授权，清除token并跳转到登录页
            uni.removeStorageSync('token');
            uni.showToast({
              title: '登录已过期，请重新登录',
              icon: 'none',
              duration: 2000
            });
            setTimeout(() => {
              uni.navigateTo({
                url: '/pages/login/index'
              });
            }, 1000);
            reject(res.data);
          } else {
            // 其他业务错误
            uni.showToast({
              title: res.data.msg || '请求失败',
              icon: 'none',
              duration: 2000
            });
            reject(res.data);
          }
        } else {
          // HTTP状态码错误
          uni.showToast({
            title: `请求失败，状态码：${res.statusCode}`,
            icon: 'none',
            duration: 2000
          });
          reject(res.data);
        }
      },
      fail: (err) => {
        // 隐藏加载提示
        if (options.loading) {
          uni.hideLoading();
        }
        
        // 网络错误等
        uni.showToast({
          title: '网络请求失败',
          icon: 'none',
          duration: 2000
        });
        reject(err);
      }
    });
  });
}