import axios from 'axios'
import config from '@/config'
import store from '../store'
import globalMethods from './global-methods'
//这里必须使用axios实例，因为已经有一个没有创建实例而直接使用的axio了，
// 在request.js，这里如果直接使用axios的话，request.js里面的拦截器也会执行
//创建一个实例再去使用这个实例请求，request.js里面的axios配置就不会生效
const instance = axios.create({
  baseURL: config.baseUrl,
  timeout: 60000,
})
// request拦截器
instance.interceptors.request.use((config) => {
  // 如果没有设置Content-Type，默认application/json
  if (!config.headers['Content-Type']) {
    config.headers['Content-Type'] = 'application/json'
  }
  return config
}, error => {
  return Promise.reject(error)
})

/*
* 响应拦截器，目前的处理是，无论失败或者成功都会返回{ code: xxx, data: xxx }这种类型的数据，没有reject和抛error。
* 如果有问题，拦截器里会进行提示，然后返回{ code: Xxx, data:xxx }这种数据。在then里面总是会接收到
* */
instance.interceptors.response.use(
  response => {
    // console.log('response',response)
    /*
    * 响应成功的拦截器，主要是对data作处理，如果没有返回data，那么会添加一个data字段，并把response.data的内容合并到data里面，然后返回
    * */
    let {data} = response
    // console.log(response)
    if (data === undefined || data === null || data === '') {
      globalMethods.$notice('请求失败，请稍后重试！')
      return {code: 500, data: []}
    } else if (typeof data === 'string') {
      return {code: 200, data}
    } else {
      if (data.data === undefined || data.data === null) {
        data.data = {...data}
      }
      let resCode = data.code
      if (resCode) {
        try {
          resCode = Number(resCode)
        } catch (e) {
          data.code = resCode = 500
        }
        if (resCode === 0) {
          data.code = resCode = 200
        }
        if (resCode !== 200) {
          globalMethods.$notice(response.data.message || '请求失败，请稍后重试！')
        }
      } else {
        data.code = 200
      }
      return data
    }
  },
  error => {
    // console.log('error', error)
    // console.log(error.response)
    // console.log(error.response.status)
    if (error.response === undefined) {
      globalMethods.$notice('服务器响应超时')
      return {code: 500, msg: '服务器响应超时', data: []}
    }
    if (error.response.status >= 500) {
      globalMethods.$notice('服务器出现错误')
      return {code: 500, msg: '服务器出现错误', data: []}
    }
    if (error.response.status === 404) {
      globalMethods.$notice('接口不存在')
      return {code: 404, msg: '接口不存在', data: []}
    }
    if (error.response.status === 400) {
      globalMethods.$notice('接口报错')
      return {code: 400, msg: '接口报错', data: []}
    }
    if (error.response.status === 401) {
      return {code: 401, msg: '用户名或密码不正确', data: []}
    } else {
      let {data} = error.response
      if (data === null || data === undefined) {
        globalMethods.$notice('请求失败，请稍后重试！')
        return {code: 200, data: []}
      } else {
        let resCode = data.code
        if (data.data === undefined || data.data === null) {
          data.data = {...data}
        }
        if (resCode && typeof resCode == 'number' && resCode !== 200) {
          globalMethods.$notice('请求失败，请稍后重试！')
        } else {
          data.code = 200
        }
        return data
      }
    }
  })

export default instance


