import axios from 'axios'
import JSEncrypt from 'jsencrypt'

// 签名所需常量
const APP_ID = 'bf6acc5386b1106428fb1096b506661c'
const PUBLIC_KEY = `MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCt12b9v0dMF7ageC2fcYIheWb4u++WvwxJUhPJ+7BhNi7wf/mKZ47VjxdJyJQgsZX+7n+56UcSGUVDI4dhdWuFWVDQM8CyngiMhmHVXds2BxNFrju42VO5s1rmd8KXrnKJb5t2e4VdmAfQdeOaITMs/ymWt40O6NDDAMQ/udMLmwIDAQAB`

function generateSign(appId) {
  const payload = {
    appId,
    timestamp: Date.now(),
  }
  const encryptor = new JSEncrypt()
  encryptor.setPublicKey(PUBLIC_KEY)
  const encrypted = encryptor.encrypt(JSON.stringify(payload))
  if (!encrypted) {
    throw new Error('签名加密失败')
  }
  return encrypted
}

// 创建axios实例
const request = axios.create({
  baseURL: '', // 使用代理前缀
  timeout: 10000, // 请求超时时间
  headers: {
    'Content-Type': 'application/json;charset=UTF-8',
  },
})

// 请求拦截器
request.interceptors.request.use(
  (config) => {
    // 生成并注入签名与 appId
    try {
      const sign = generateSign(APP_ID)
      config.headers = config.headers || {}
      config.headers.appId = APP_ID
      config.headers.sign = sign
    } catch (e) {
      console.error('签名生成失败:', e)
      return Promise.reject(e)
    }

    // 不再强制携带或校验 token，直接请求服务

    // 添加时间戳防止缓存
    if (config.method === 'get') {
      config.params = {
        ...config.params,
        _t: Date.now(),
      }
    }

    // 处理不同类型的数据提交
    if (config.data instanceof FormData) {
      // FormData：删除Content-Type让浏览器自动设置multipart/form-data
      delete config.headers['Content-Type']
      console.log('检测到FormData，已删除Content-Type，让浏览器自动设置')
    } else if (config.headers['Content-Type'] === 'application/x-www-form-urlencoded') {
      // 表单数据：保持application/x-www-form-urlencoded
      console.log('使用application/x-www-form-urlencoded格式')
    }

    // 允许接口调用时自定义headers
    if (config.customHeaders) {
      config.headers = {
        ...config.headers,
        ...config.customHeaders
      }
      delete config.customHeaders // 删除自定义属性，避免发送到服务器
    }

    console.log('请求发送:', config)
    return config
  },
  (error) => {
    console.error('请求错误:', error)
    return Promise.reject(error)
  },
)

// 响应拦截器
request.interceptors.response.use(
  (response) => {
    console.log('响应接收:', response)

    // 统一处理响应数据
    const { data } = response
    console.log('data', data)
    // 根据后端返回的数据结构调整
    if (data.code === 0 || data.success === true) {
      return data.data || data
    } else {
      // 处理业务错误
      const code = data.code
      if (code === 401 || code === 403) {
        // 未授权/禁止访问，不做页面跳转
        return Promise.reject(new Error('未授权或拒绝访问'))
      }
      const errorMsg = data.message || data.msg || '请求失败'
      console.error('业务错误:', errorMsg)
      return Promise.reject(new Error(errorMsg))
    }
  },
  (error) => {
    console.error('响应错误:', error)

    let errorMsg = '网络错误'

    if (error.response) {
      // 服务器返回错误状态码
      const { status, data } = error.response

      switch (status) {
        case 400:
          errorMsg = '请求参数错误'
          break
        case 401:
          errorMsg = '未授权或拒绝访问'
          break
        case 403:
          errorMsg = '未授权或拒绝访问'
          break
        case 404:
          errorMsg = '请求地址不存在'
          break
        case 500:
          errorMsg = '服务器内部错误'
          break
        default:
          errorMsg = data?.message || data?.msg || `请求失败(${status})`
      }
    } else if (error.request) {
      // 请求发送但没有收到响应
      errorMsg = '网络连接超时'
    }

    return Promise.reject(new Error(errorMsg))
  },
)

export default request
