// 引入axios
import axios from 'axios';
import BASE from '@tools/basicTool.js';

axios.defaults.withCredentials = true;

/**
 * 通用请求函数
 * @param {Object} options 详细配置项，使用方法与所有配置项说明如下：

  this.API.requestData({
    isMust: true, // 请求是否携带 token ，默认为 true ，可缺省 
    showLoading: false, // 请求是否显示加载中遮罩层，默认 false ，可缺省
    method: "GET", // 请求方式，默认为 GET ，可缺省
    baseURL: "http://192.168.10.23:8082/", // 请求服务器地址 + 端口，可缺省
    subUrl: "api/repassword", // 请求接口地址，必传项
    timeout: 3000, // 请求超时时间，默认 3s ，可缺省
    body: { id: "151", name: "张三" }, // 请求体所携带的 Body ，如果后端要求 Body 传参的话需要携带此参数，且请求方式需为 POST
    data: { name: "admin", pasword: "123456" }, // 请求所携带参数，默认为空，可缺省
    success (res) {
      // 请求成功的回调
    },
    fail (error) {
      // 请求失败的回调
    }
  });

 */
export function requestData(options) {
  return new Promise((resolve, reject) => {

    if (options.showLoading) {
      BASE.showLoading();
    }

    // 包装请求头
    let headers = options.headers || {
      'Content-Type': 'application/x-www-form-urlencoded',
      'Access-Control-Allow-Origin': '*',
      'Access-Control-Allow-Credentials': 'true'
    };

    // 请求是否携带 token
    const isMust = (options.isMust == true || options.isMust == false) ? options.isMust : true;
    if (isMust) headers.authToken = localStorage.getItem('authToken');

    // 创建请求实例
    const XHRReq = axios.create({
      headers,
      withCredentials: true,
      crossDomain: true,
      baseURL: options.baseURL || window.__MODE__.baseURL || '/api/',
      timeout: options.timeout || 30000, // 请求超时时间 - 3s
    });

    // 请求拦截器
    XHRReq.interceptors.request.use((config) => {
      return config;
    }, (err) => {
      return Promise.reject(err);
    });

    // 统一格式包装请求参数
    let params = new URLSearchParams();
    for (let key in (options.data || {})) {
      params.append(key, options.data[key]);
    }

    // 发起请求
    XHRReq({
      url: options.subUrl,
      method: options.method || 'GET',
      params,
    }).then(response => {
      if (options.showLoading) {
        BASE.closeLoading();
      }
      if (response.data.code === 2002) { // 用户类请求错误code (账号密码错误、用户锁定、token过期等)

        localStorage.removeItem('authToken');
        BASE.showMsg({
          msg: (response.data && response.data.msg) || ("请求出错[" + response.data.code + "]")
        });

        // window.location.reload();
        // window.__STATICVUE__.$router.replace('/login');

      } else if (response.data.code === 200 || response.data.length >= 0 || response.data.records) { // 请求成功 code

        options.success && options.success(response.data);
        resolve(response);

      } else { // 其他code
        BASE.closeLoading();
        BASE.showMsg({
          msg: (response.data && response.data.msg) || ("请求出错[" + response.data.code + "]")
        });

      }
    }).catch(error => {

      if (options.showLoading) {
        BASE.closeLoading();
      }

      options.fail && options.fail(error);
      reject(error);

    });
  });
}


/**
 * 原生 axios 请求方法
 * @param {Object} options 请求配置项，调用方法：
  this.API.get({
    showLoading: false, // 请求是否显示加载中遮罩层，默认 false ，可缺省
    baseURL: "http://192.168.10.23:8082/", // 请求服务器地址 + 端口，可缺省
    subUrl: "api/repassword", // 请求接口地址，必传项
    success (res) {
      // 请求成功的回调
    },
  });


 */
function get(options) {
  const baseURL = options.baseURL || window.__MODE__.baseURL || '/api/';

  if (options.showLoading) {
    BASE.showLoading();
  }

  axios.get(baseURL + options.subUrl)
    .then(res => {
      if (res.code === 200) {
        if (options.showLoading) {
          BASE.closeLoading();
        }
        options.success && options.success(res)
      } else {
        if (options.showLoading) {
          BASE.closeLoading();
        }
        BASE.showMsg({
          msg: (res.data && res.data.msg) || ("请求出错[" + res.data.code + "]")
        });
      }
    }).catch(err => {
      if (options.showLoading) {
        BASE.closeLoading();
      }
      BASE.showMsg({
        msg: "请求未能完成"
      });
    });
}


export default {
  requestData,
  get,
}
