import Vue from "vue";
// import Store from "@/store";
import axios from "axios";
import { loadProgressBar } from "axios-progress-bar";
import cachingGet from "./axiosCache";
import { notifyInvalidTokenThrottled } from "./axiosNotice";
import { getToken, removeToken } from "../auth/auth";
import axiosRetry from "axios-retry";
import { PLATFORM, DEVICE_ID } from "@/constant/constants";
import { Notification } from "element-ui";

// Full config:  https://github.com/axios/axios#request-config
// axios.defaults.baseURL = process.env.BASE_URL || process.env.apiUrl || '';
// axios.defaults.headers.common['Authorization'] = AUTH_TOKEN;

const config = {
  // baseURL: process.env.baseURL || process.env.apiUrl || ""
  timeout: 60 * 1000, // Timeout
  withCredentials: true, // Check cross-site Access-Control
};
const cacheGetUrls = [];

const _axiosApp = axios.create(config);
axiosRetry(_axiosApp);

// function gToken(uri, token) {
//   const now = Date.now();
//   // console.log(`${uri}&${now}&${token}`);
//   const a = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
//   let randomStr = "";
//   for (let i = 0; i < 6; i++) {
//     const idx = Math.round(Math.random() * 100) % a.length;
//     randomStr += a[idx];
//   }

//   const Authorization = `Token ${randomStr}${btoa(
//     uri + "&" + now + "&" + token
//   )}`;

//   return Authorization;
// }

_axiosApp.interceptors.request.use(
  function (config) {
    const wk_token = getToken();
    if (wk_token) {
      // config.headers.common["Authorization"] = gToken(config.url, wk_token);
      config.headers.common["Authorization"] = wk_token;
    }
    config.headers.common["platform"] = PLATFORM;
    config.headers.common["deviceId"] = DEVICE_ID;
    config.headers.common["time"] = Date.now();
    return config;
  },
  function (error) {
    // Do something with request error
    Vue.prototype.$notify({
      showClose: true,
      message: error,
      type: "error",
    });
    return Promise.reject(error);
  }
);

// Add a response interceptor
_axiosApp.interceptors.response.use(
  (response) => {
    return response;
  },
  (error) => {
    const showErrorMessage = !error.config.noErrorMessage;
    if (!error.response) {
      if (showErrorMessage) {
        // "Network Error" 网络不通，直接返回
        Notification({
          showClose: true,
          message: "网络连接异常，请检查网络设置。",
          type: "error",
        });
      }
      return Promise.reject(error);
    }
    // 这里是返回状态码不为200时候的错误处理
    let status = error.response.status;

    // 登录失效 跳转登录页面
    if (status == 403 || status == 401) {
      notifyInvalidTokenThrottled();
      removeToken();
      return Promise.reject(error);
    } else if (status == 405) {
      if (showErrorMessage) {
        Notification({
          showClose: true,
          message: "没有权限！",
          type: "error",
        });
      }
      return Promise.reject(error);
    } else if (status == 502) {
      if (showErrorMessage) {
        Notification({
          showClose: true,
          message: "服务器异常(502)！",
          type: "error",
        });
      }
      return Promise.reject(error);
    }

    if (status != 200) {
      const data = error.response.data;
      if (data && data.message) {
        if (showErrorMessage) {
          Notification({
            showClose: true,
            message: data.message,
            type: "error",
          });
        }
      } else {
        if (showErrorMessage) {
          Notification({
            showClose: true,
            message: "未定义异常: " + JSON.stringify(data, 2),
            type: "error",
          });
        }
      }
      return Promise.reject(error);
    }
  }
);

_axiosApp.get = cachingGet(_axiosApp.get, cacheGetUrls);
loadProgressBar(_axiosApp);

Plugin.install = function (Vue) {
  Object.defineProperties(Vue.prototype, {
    $http: {
      get() {
        return _axiosApp;
      },
    },
  });
};

Vue.use(Plugin);

export default Plugin;

export const httpApp = _axiosApp;
