/**
 * 全站http配置
 *
 * axios参数说明
 * isSerialize是否开启form表单提交
 * isToken是否需要token
 */
import "nprogress/nprogress.css";

import website from "@/config/website";
import router from "@/router/router";
import store from "@/store/";
import { getToken } from "@/util/auth";
import { serialize } from "@/util/util";
import axios from "axios";
import { Message } from "element-ui";
import { Base64 } from "js-base64";
import NProgress from "nprogress";

const service = axios.create({
  // baseURL: 'https://jibaoadmin.qemcap.com/api',
  timeout: 60000
});
const replaceStr = JSON.parse(process.env.VUE_APP_REPLACE_STR);
//默认超时时间
service.defaults.timeout = 60000;
//返回其他状态码
service.defaults.validateStatus = function(status) {
  return status >= 200 && status <= 500;
};
//跨域请求，允许保存cookie
service.defaults.withCredentials = true;
// NProgress 配置
NProgress.configure({ showSpinner: false });
// http request拦截
service.interceptors.request.use(
  config => {
    //开启 progress bar
    NProgress.start();
    const meta = config.meta || {};
    const isToken = meta.isToken === false;
    config.headers["Authorization"] = `Basic ${Base64.encode(
      `${website.clientId}:${website.clientSecret}`
    )}`;
    if (getToken() && !isToken) {
      //让每个请求携带token--['Authorization']为自定义key 请根据实际情况自行修改
      config.headers["Jobslink-Auth"] = "bearer " + getToken();
    }
    // headers中配置serialize为true开启序列化
    if (config.method === "post" && meta.isSerialize === true) {
      config.data = serialize(config.data);
    }
    return config;
  },
  error => {
    return Promise.reject(error);
  }
);

axios.interceptors.request.use(
  config => {
    //开启 progress bar
    NProgress.start();
    const meta = config.meta || {};
    const isToken = meta.isToken === false;
    config.headers["Authorization"] = `Basic ${Base64.encode(
      `${website.clientId}:${website.clientSecret}`
    )}`;
    if (getToken() && !isToken) {
      //让每个请求携带token--['Authorization']为自定义key 请根据实际情况自行修改
      config.headers["Jobslink-Auth"] = "bearer " + getToken();
    }
    // headers中配置serialize为true开启序列化
    if (config.method === "post" && meta.isSerialize === true) {
      config.data = serialize(config.data);
    }
    return config;
  },
  error => {
    return Promise.reject(error);
  }
);
// http response 拦截
service.interceptors.response.use(
  res => {
    //关闭 progress bar
    NProgress.done();
    //获取状态码
    const status = res.data.code || res.status;
    const statusWhiteList = website.statusWhiteList || [];
    const message = res.data.msg || res.data.error_description || "未知错误";
    //如果在白名单里则自行catch逻辑处理
    if (statusWhiteList.includes(status)) return Promise.reject(res);
    //如果是401则跳转到登录页面
    if (status === 401) {
      store.dispatch("FedLogOut").then(() => {
        if (process.env.NODE_ENV !== "development") {
          window.location.href = process.env.VUE_APP_LOGIN_NEXT;
        }
      });
      // store.dispatch('FedLogOut').then(() => router.push({path: '/login'}));
    }
    // 如果请求为500统一处理
    const err = new Error(message);
    err.response = res;
    err.status = status;
    if (message.length > 100) {
      Message({ message: "系统繁忙", type: "error" });
      return Promise.reject(err);
    }
    // 如果请求为非200否者默认统一处理
    if (status !== 200) {
      Message({ message: message, type: "error" });
      return Promise.reject(err, res);
    }
    if (res.data instanceof Blob) {
      return res;
    }
    return transformReplaceStr(res);
  },
  error => {
    NProgress.done();
    if (error.message.includes("timeout")) {
      Message({ message: "请求超时", type: "error" });
    }
    return Promise.reject(new Error(error), error);
  }
);

// 递归替换 url
function transformReplaceStr(props) {
  if (typeof props !== "object" || props === null) {
    for (const key in replaceStr) {
      if (typeof props === "string") {
        props = props.replace(key, replaceStr[key]);
      }
    }
    return props;
  }
  let result;
  if (props instanceof Array) {
    result = [];
  } else {
    result = {};
  }
  for (let key in props) {
    if (props.hasOwnProperty(key)) {
      result[key] = transformReplaceStr(props[key]);
    }
  }
  return result;
}

export default service;
