import axios from 'axios'
import { Message, MessageBox } from 'element-ui'
import store from '../store'
import { getToken } from '@/utils/auth'

// 网络请求约定属性名，不可在业务中使用
const whitelist = ['X-Token', 'token', 'pageIndex', 'pageSize']
// 创建axios实例
const service = axios.create({
  baseURL: process.env.BASE_API, // api的base_url
  timeout: 10000 // 请求超时时间
})

// request拦截器
service.interceptors.request.use(config => {
  const configcopy = Object.assign({}, config)
  if (store.getters.token) {
    configcopy.headers['X-Token'] = getToken() // 让每个请求携带自定义token 请根据实际情况自行修改
  }
  if (configcopy.params) {
    for (const attr in configcopy.params) {
      if (whitelist.indexOf(attr) > -1) {
        // 约定的属性不用转换
        continue
      }
      configcopy.params[encodeURIComponent('mapBean[' + attr + ']')] = configcopy.params[attr]
      delete configcopy.params[attr]
    }
  }
  // console.log(configcopy)
  // console.log(cc)
  return configcopy
}, error => {
  // Do something with request error
  console.log(error) // for debug
  Promise.reject(error)
})

// respone拦截器
service.interceptors.response.use(
  response => {
  /**
  * code为非20000是抛错 可结合自己业务进行修改
  */
    const res = response.data
    if (response.status !== 200) {
      Message({
        message: res.message || '请求失败，状态码：' + res.code,
        type: 'error',
        duration: 5 * 1000
      })

      // 50008:非法的token; 50012:其他客户端登录了;  50014:Token 过期了;
      if (res.code === 50008 || res.code === 50012 || res.code === 50014) {
        MessageBox.confirm('你已被登出，可以取消继续留在该页面，或者重新登录', '确定登出', {
          confirmButtonText: '重新登录',
          cancelButtonText: '取消',
          type: 'warning'
        }).then(() => {
          store.dispatch('FedLogOut').then(() => {
            location.reload()// 为了重新实例化vue-router对象 避免bug
          })
        })
      }
      return Promise.reject('error')
    } else {
      return response.data
    }
  },
  error => {
    console.log('err' + error)// for debug
    Message({
      message: error.message,
      type: 'error',
      duration: 5 * 1000
    })
    return Promise.reject(error)
  }
)

export default service
