import axios from "axios";
import router from "@/router/routers";
import { Notification, Message, MessageBox } from "element-ui";
import store from "../store";
import { getToken } from "@/utils/auth";
import Config from "@/settings";
import Cookies from "js-cookie";

// 创建axios实例
const service = axios.create({
  baseURL:
    process.env.NODE_ENV === "production" ? process.env.VUE_APP_BASE_API : "/", // api 的 base_url
  timeout: Config.timeout // 请求超时时间
});

// request拦截器
service.interceptors.request.use(
  config => {
    if (getToken()) {
      config.headers["Authorization"] = `Bearer ${getToken()}`; // 让每个请求携带自定义token 请根据实际情况自行修改
    }
    config.headers["Content-Type"] = "application/json";
    return config;
  },
  error => {
    Promise.reject(error);
  }
);

// response 拦截器
service.interceptors.response.use(
  response => {
    debugger;
    const code = response.status;
    const res = response.data;
    if ([2007, 2006].includes(res.code)) {
      return MessageBox.confirm(`${res.message}`, "提示", {
        confirmButtonText: "重新登录",
        showCancelButton: false,
        closeOnClickModal: false,
        closeOnPressEscape: false,
        center: true,
        showClose: false,
        customClass: "expire-tip"
      }).then(() => {
        store.dispatch("LogOut");
      });
    } else if ([2000, 2001, 2002].includes(res.code)) {
      Message({
        message: res.message,
        duration: 2000,
        type: "error"
      });
      store.dispatch("LogOut");
      return false;
    } else if (res.code !== 0) {
      if (toString.call(res) !== "[object Blob]") {
        setTimeout(() => {
          Message.closeAll();
          Message({
            message: `${res.message}-${res.requestId}`,
            duration: 2000,
            type: "error"
          });
        });
      }
    }
    if (code < 200 || code > 300) {
      Notification.error({
        title: response.message
      });
      return Promise.reject("error");
    }

    return response.data;
  },
  error => {
    debugger;
    // 兼容blob下载出错json提示
    if (
      error.response.data instanceof Blob &&
      error.response.data.type.toLowerCase().indexOf("json") !== -1
    ) {
      const reader = new FileReader();
      reader.readAsText(error.response.data, "utf-8");
      reader.onload = function(e) {
        const errorMsg = JSON.parse(reader.result).message;
        Notification.error({
          title: errorMsg,
          duration: 5000
        });
      };
    } else {
      let code = 0;
      try {
        code = error.response.data.status;
      } catch (e) {
        if (error.toString().indexOf("Error: timeout") !== -1) {
          Notification.error({
            title: "网络请求超时",
            duration: 5000
          });
          return Promise.reject(error);
        }
      }
      console.log(code);
      if (code) {
        if (code === 401) {
          store.dispatch("LogOut").then(() => {
            // 用户登录界面提示
            Cookies.set("point", 401);
            location.reload();
          });
        } else if (code === 403) {
          router.push({ path: "/401" });
        } else {
          const errorMsg = error.response.data.message;
          if (errorMsg !== undefined) {
            Notification.error({
              title: errorMsg,
              duration: 5000
            });
          }
        }
      } else {
        Notification.error({
          title: "接口请求失败",
          duration: 5000
        });
      }
    }
    return Promise.reject(error);
  }
);

// 异步get请求
export function get(url, data) {
  return new Promise((resolve, reject) => {
    service
      .get(url, {
        params: data
      })
      .then(res => {
        if (res) {
          resolve(res);
        }
      })
      .catch(error => {
        reject(error);
      });
  });
}

// 异步post请求
export function post(url, data) {
  return new Promise((resolve, reject) => {
    // qs.stringify(data)
    service
      .post(url, data, {
        headers: {
          "Content-Type": "application/x-www-form-urlencoded",
          Accept: "application/json"
        }
      })
      .then(res => {
        if (res) {
          resolve(res);
        }
      })
      .catch(error => {
        // reject(error)
        console.log(error);
      });
  });
}

export default service;
