/*
 * @Author: Do not edit
 * @Date: 2023-11-20 11:02:29
 * @LastEditTime: 2024-01-11 10:34:34
 * @LastEditors: DY
 * @Description:
 */
import axios from 'axios'
import { getTenantId, getAccessToken, getRefreshToken, setToken } from '@/utils/auth'
import { refreshToken } from '@/api/login'
import { MessageBox } from 'element-ui'

axios.defaults.headers['Content-Type'] = 'application/json;charset=utf-8'

const service = axios.create({
  // baseURL: 'http://192.168.0.33:48082/admin-api',
  baseURL: 'http://10.70.2.2:8080/admin-api',
  timeout: 30000,
  withCredentials: false
})

// 是否显示重新登录
export const isRelogin = { show: false }
// 是否正在刷新中
let isRefreshToken = false
// 请求队列
let requestList = []

// request拦截器
service.interceptors.request.use(config => {
  // 设置租户
  const tenantId = getTenantId()
  config.headers['tenant-id'] = tenantId
  // 是否需要设置 token
  const isToken = (config.headers || {}).isToken === false
  if (getAccessToken() && !isToken) {
    config.headers.Authorization = 'Bearer ' + getAccessToken() // 让每个请求携带自定义token 请根据实际情况自行修改
  }
  return config
})

// 响应拦截器
service.interceptors.response.use(async res => {
  // return Promise.reject(error)
  // 访问令牌过期
  if (res.data.code === 401) {
    if (!isRefreshToken) {
      isRefreshToken = true
      // 1. 如果获取不到刷新令牌，则只能执行登出操作
      if (!getRefreshToken()) {
        return handleAuthorized()
      }
      // 2. 进行刷新访问令牌
      try {
        const refreshTokenRes = await refreshToken()
        // 2.1 刷新成功，则回放队列的请求 + 当前请求
        // if (refreshTokenRes.data.code === 0) {
        setToken(refreshTokenRes.data.data)
        requestList.forEach(cb => cb())
        return service(res.config)
        // } else {
        //   return handleAuthorized()
        // }
      } catch (e) { // 为什么需要 catch 异常呢？刷新失败时，请求因为 Promise.reject 触发异常。
        // 2.2 刷新失败，只回放队列的请求
        requestList.forEach(cb => cb())
        // 提示是否要登出。即不回放当前请求！不然会形成递归
        return handleAuthorized()
      } finally {
        requestList = []
        isRefreshToken = false
      }
    } else {
      // 添加到队列，等待刷新获取到新的令牌
      return new Promise(resolve => {
        requestList.push(() => {
          res.config.headers.Authorization = 'Bearer ' + getAccessToken() // 让每个请求携带自定义token 请根据实际情况自行修改
          resolve(service(res.config))
        })
      })
    }
  } else {
    return res
  }
  // if (res.dat)
})

function handleAuthorized () {
  if (!isRelogin.show) {
    isRelogin.show = true
    MessageBox.confirm('登录状态已过期，您可以继续留在该页面，或者重新登录', '系统提示', {
      confirmButtonText: '重新登录',
      cancelButtonText: '取消',
      type: 'warning'
    }
    ).then(() => {
      isRelogin.show = false
      location.href = ''
    }).catch(() => {
      isRelogin.show = false
    })
  }
  // return Promise.reject(new Error('无效的会话，或者会话已过期，请重新登录。'))
}

export default service
