/* eslint-disable prefer-promise-reject-errors */
import config from '@/config';
import store from '@/store';
import { checkTokenIsValid, refreshTokenPage, checkLoginNew } from '@/service/user'
import errorRequest from './errorRequest.js';
// get参数反序列化
const setQueryConfig = function (queryConfig) {
  let _str = ''
  for (const o in queryConfig) {
    if (queryConfig[o] !== -1) {
      _str += o + '=' + queryConfig[o] + '&'
    }
  }
  _str = _str.substring(0, _str.length - 1) // 末尾是&
  return _str
}

function storeUser() {
  return store.state.user.userInfo;
}

function storeToken() {
  return store.state.user.token;
}

// 通用参数携带
function commonParams() {
  // openid=${storeUser().openId}&
  let url = `pubname=${config.brsgServer.pubname}`
  if (storeUser().projectId) {
    url = url + `&projectId=${storeUser().projectId}`
  }
  if (storeUser().userName) {
    url = url + `&userName=${storeUser().userName}`
  }
  if (storeUser().userId) {
    url = url + `&userId=${storeUser().userId}`
  }
  if (storeToken()) {
    url = url + `&saga-token=${storeToken()}`
  }
  return url;
}

export default function (info) {
  if (info.url.startsWith('/')) {
    const serverSp = info.serverSp ? info.serverSp : config.serverUrl
    info.url = serverSp + info.url
  }
  // get参数格式化(新增通用参数处理)
  if (info.params && (info.method == 'GET' || info.method == 'get')) {
    if (info.url.indexOf("?") != -1) { // 携带有参数
      info.url = `${info.url}&${setQueryConfig(info.params)}`
    } else {
      info.url = `${info.url}?${setQueryConfig(info.params)}`
    }
  }
  if (info.isComParams) {
    if (info.url.indexOf("?") != -1) { // 携带有参数
      info.url = `${info.url}&${commonParams()}`
    } else {
      info.url = `${info.url}?${commonParams()}`
    }
  }

  const token = store.state.user.token;
  if (token) {
    info.header = Object.assign(
      { 'saga-token': token }
      , info.header)
  }

  info.timeout = info.timeout || 10 * 1000; // 默认超时为10s

  const isNotShowErrorToast = info.isNotShowErrorToast || false;
  delete info.isNotShowErrorToast;

  const errorSave = info.errorSave || false;
  delete info.errorSave;

  return new Promise((resolve, reject) => {
    // 在这里的请求success 和fail 里进行hideLoading 原因有2点
    // 1.是有些请求showLoading了,但是在异常情况不需要处理,就可能未hideLoading导致页面异常
    // 2.是有些是在这里showToast 需要先将有showLoading 的 hide掉才能showToast出来

    wx.request(Object.assign(info, {
      success: (res) => {
        try {
          wx.hideLoading({
            fial: () => { },
            noConflict: true
          });
        } catch (error) {
          console.error(error);
        }
        if (res.statusCode === 401) {
          console.log(checkTokenIsValid())
          if (checkTokenIsValid() == 2) { // 登录过期后重新从首页刷新进入
            store.commit('clearToken', '');
            wx.redirectTo({ url: '/packagesEnv/pages/home/index' });
          } else { // 续约
            if (!store.state.user.refreshUse) {
              store.commit('setRefreshUse', true);
              refreshTokenPage().then(res => {
                store.commit('setRefreshUse', false);
              }).catch((err) => {
                store.commit('setRefreshUse', false);
                store.commit('clearToken', '');
                wx.redirectTo({ url: '/packagesEnv/pages/home/index' });
              })
            }
          }
          reject('登录过期');
        } else if (res.statusCode >= 400) {
          reject(res.errMsg);
          if (!isNotShowErrorToast) {
            setTimeout(() => {
              wx.showToast({
                title: `接口请求失败：code=${res.statusCode}，msg=${res.message || JSON.stringify(res)}`,
                icon: 'none',
                duration: 5000
              })
            }, 0);
          } else {
            console.log(`接口请求失败：code=${res.statusCode}，msg=${res.message || JSON.stringify(res)}`)
          }
          // 错误接口信息存到后台数据库  persagy定制
          errorSave && errorRequest({
            name: info.url, // 类型：String  必有字段  备注：接口名字
            input: info.data || '', // 类型：String  必有字段  备注：请求输入参数
            exception: JSON.stringify(res.errMsg) // 类型：String  必有字段  备注：异常信息
          });
        } else if (res.data.code !== 1 && res.data.code) {

          reject(res.data);
          if (!isNotShowErrorToast) {
            // 防止代码里异常情况下的业务代码里hideLoading, 会把此时的toast 关掉里, 故用延迟处理, 让业务代码hideloading执行完, 再showtoast, 这样就不回关闭里
            setTimeout(() => {
              wx.showToast({
                title: `${res.data.msg}`,
                icon: 'none',
                duration: 5000
              })
            }, 0);
          } else {
            console.log('请求失败：' + `${res.data.msg}`)
          }
          errorSave && errorRequest({
            name: info.url, // 类型：String  必有字段  备注：接口名字
            input: info.data || '', // 类型：String  必有字段  备注：请求输入参数
            exception: JSON.stringify(res.data) // 类型：String  必有字段  备注：异常信息
          });
        } else {
          resolve(res.data);
        }
      },
      fail: (res) => {
        try {
          wx.hideLoading({
            fial: () => { },
            noConflict: true
          });
        } catch (error) {
          // console.error(error);
        }
        reject({ ...res, reason: 'wxRequestFail' });
        errorSave && errorRequest({
          name: info.url, // 类型：String  必有字段  备注：接口名字
          input: info.data || '', // 类型：String  必有字段  备注：请求输入参数
          exception: JSON.stringify(res) // 类型：String  必有字段  备注：异常信息
        });
        if (!isNotShowErrorToast) {
          // 防止有loading的时候toast 闪现，故用settimout 来延迟，让reject函数先hideLoading ,再toast
          // setTimeout(() => {
          //   wx.showToast({
          //     title: `网络异常，请稍后重试`,
          //     icon: 'none',
          //     duration: 5000
          //   })
          // }, 0);
        } else {
          console.log(`微信接口request调用失败：${JSON.stringify(res)}`)
        }
      }
    }))
  })
}
