import axios from 'axios';
import { Message, MessageBox } from 'element-ui';
import store from '../store';
import config from '../config/index';
import { errorHandle } from './validate';

// 创建axios实例
const service = axios.create({
  baseURL: config.SERVER_URL, // api的base_url
  timeout: 10000,
});
let logout = false;
// request拦截器
service.interceptors.request.use(
  conf => {
    store.dispatch('fetchStart');
    // if(conf.method)

    conf.headers = {
      ...conf.headers,
      reqSource: 'pc',
      token: store.getters.token ? store.getters.token : '',
    };
    if (conf.method != 'get') {
      conf.params = null;
    }
    return conf;
  },
  error => {
    // Do something with request error
    console.log(error); // for debug
    Promise.reject(error);
  }
);

// respone拦截器
service.interceptors.response.use(response => {
  const res = response.data;
  /**
   * code为非'1000'是抛错
   */
  setTimeout(() => {
    store.dispatch('fetchDone');
  }, 500);
  if (res.code !== 1000) {
    if (
      response.headers &&
      response.headers['content-type'] === 'application/octet-stream'
    ) {
      return response;
    }
    Message({
      message: res.msg || '网络错误!',
      type: 'error',
      duration: 5 * 1000,
    });

    // -2:其他客户端登录了;Token 过期了;
    if (res.code === -2) {
      if (logout) return;
      logout = true;
      MessageBox.confirm(
        '你已被登出,可以取消继续留在该页面,或者重新登录',
        '确定登出',
        {
          confirmButtonText: '重新登录',
          cancelButtonText: '取消',
          type: 'warning',
        }
      )
        .then(() => {
          store.dispatch('FedLogOut').then(() => {
            location.reload(); // 为了重新实例化vue-router对象 避免bug
          });
        })
        .catch(err => {
          console.log(err);
          logout = false;
        });
    }
    return Promise.reject(response.data);
  } else {
    return response.data;
  }
}, errorHandle);

export default service;