import axios from 'axios'
import qs from 'qs' // 引入axios时同时引入qs即可。
import { Message, MessageBox } from 'element-ui'
import store from '../store'
import { getToken } from '@/utils/auth'

// const baseURL = process.env.BASE_API
// 创建axios实例
const service = axios.create({
  // baseURL: baseURL, // api的base_url
  timeout: 15000, // 请求超时时间
  headers: {
    'Content-Type': 'application/x-www-form-urlencoded'
  },
  // `transformRequest` 允许在向服务器发送前，修改请求数据
  // 只能用在 'PUT', 'POST' 和 'PATCH' 这几个请求方法
  // 后面数组中的函数必须返回一个字符串，或 ArrayBuffer，或 Stream
  // 解决axios默认发送数据时，数据格式是Request Payload的问题
  transformRequest: [function(data) {
    // 对 data 进行任意转换处理
    return qs.stringify(data)
  }]
  // `paramsSerializer` 是一个负责 `params` 序列化的函数
  // (e.g. https://www.npmjs.com/package/qs, http://api.jquery.com/jquery.param/)
  //   paramsSerializer: function(params) {
  //     return qs.stringify(params, {arrayFormat: 'repeat'})
  //   },

})
// request拦截器
service.interceptors.request.use(config => {
  if (store.getters.token) {
    config.headers['Authorization'] = getToken() // 让每个请求携带自定义token 请根据实际情况自行修改
  }
  return config
}, error => {
  // Do something with request error
  console.log(error) // for debug
  Promise.reject(error)
})

// respone拦截器
service.interceptors.response.use(
  response => {
    /**
		* state为非"success"时抛错
		*/
    const res = response.data
    if (res.state && res.state.toLowerCase() !== 'success') {
      Message({
        message: res.message,
        type: 'error',
        duration: 5 * 1000
      })
      // 50008:非法的token; 50012:其他客户端登录了;  "notoken":Token 过期了
      if (res.state.toLowerCase() === 50008 || res.state.toLowerCase() === 50012 || res.state.toLowerCase() === 'notoken') {
        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
    console.log(error) // for debug
    if (error && error.response) {
      switch (error.response.status) { // 跨域存在获取不到状态码的情况
        case 400:
          error.message = `请求错误(400):${error.response.config.url}`
          break

        case 401:
          error.message = `未授权，请登录(401):${error.response.config.url}`
          store.dispatch('FedLogOut').then(() => {
            location.reload() // 为了重新实例化vue-router对象 避免bug
          })
          break

        case 403:
          error.message = `拒绝访问(403):${error.response.config.url}`
          break

        case 404:
          error.message = `请求地址出错(404): ${error.response.config.url}`
          break

        case 408:
          error.message = `请求超时(408):${error.response.config.url}`
          break

        case 500:
          error.message = `服务器内部错误(500):${error.response.config.url}`
          break

        case 501:
          error.message = `服务未实现(501):${error.response.config.url}`
          break

        case 502:
          error.message = `网关错误(502):${error.response.config.url}`
          break

        case 503:
          error.message = `服务不可用(503):${error.response.config.url}`
          break

        case 504:
          error.message = `网关超时(504):${error.response.config.url}`
          break

        case 505:
          error.message = `HTTP版本不受支持(505):${error.response.config.url}`
          break

        default:
          error.message = `连接错误:${error.response.status}`
          break
      }
    } else {
      error.message = '网络出现问题，请稍后重试!'
    }

    Message({
      message: error.message,
      type: 'error',
      duration: 5 * 1000
    })
    return Promise.reject(error)
  }
)

export default service
