// 请求
import axios from 'axios';
import $store from '@/sheep/store';
import $storage from '@/sheep/utils/storage';
import { ElMessage } from 'element-plus';
import { isNil } from 'lodash';
import { baseURL } from '@/sheep/config';
import { apiRouting } from '@/sheep/config/api-routing';
import { getCurrentLanguage } from '@/locales';

const options = {
  // 显示操作成功消息 默认不显示
  showSuccessMessage: false,
  // 显示失败消息 默认显示

  showErrorMessage: true,
  // 显示请求Loading 默认不显示
  showLoading: false,
  // ...
};

/**
 * @description 认证失败的错误码列表
 */
const AUTH_FAILURE_CODES = ['401', '7002', '598'];

/**
 * @description 处理认证失败的统一逻辑
 */
const handleAuthFailure = (errorData) => {
  // 检查当前请求的接口是否为登录相关接口
  const requestUrl = errorData?.config?.url || '';
  console.log(requestUrl);
  const isLoginAPI = requestUrl.includes('/login/login');

  if (isLoginAPI) {
    // 登录相关接口，不处理认证失败，让登录页面自己处理错误
    ElMessage.error(errorData.data.message);
    // 如果连原生弹窗都失败，直接执行登出
    return Promise.reject(errorData.data);
  } else {
    try {
      // 使用原生confirm弹窗
      const userConfirmed = window.confirm('认证失败，登录状态已失效\n\n点击"确定"立即重新登录');

      if (userConfirmed) {
        console.log('用户确认认证失败，执行登出');
        $store('account').logout(true);
      } else {
        console.log('用户取消认证失败处理，显示警告信息');
        // 用户选择取消，显示警告但不强制登出
        ElMessage.warning('认证已失效，部分功能可能无法正常使用，建议重新登录');
      }
    } catch (error) {
      console.error('原生弹窗显示失败:', error);
      // 如果连原生弹窗都失败，直接执行登出
      $store('account').logout(true);
    }
  }
};

/**
 * @description axios请求基础配置 可直接使用访问自定义请求
 */
export const request = axios.create({
  baseURL,
  timeout: 20000,
  method: 'GET',
  headers: {
    // "Accept": "*/*",
    'Content-Type': 'application/json;charset=UTF-8',
  },
  options,
});

/**
 * @description axios请求拦截器
 */
request.interceptors.request.use(
  (config) => {
    $store('app').setRequestCounter(1);
    const token = $storage.get('token');
    if (token) config.headers['Accesstoken'] = token;

    // 添加语言请求头
    const currentLanguage = getCurrentLanguage();
    const languageCode = currentLanguage === 'en-US' ? 'en' : 'zh';
    config.headers['Accept-Language'] = languageCode;
    config.headers['lang'] = currentLanguage;

    // 🔑 API路由处理
    const processedConfig = apiRouting.processRequest(config);

    return processedConfig;
  },
  (error) => {
    $store('app').setRequestCounter(-1);
    return Promise.reject(error);
  },
);

/**
 * @description axios响应拦截器
 */
request.interceptors.response.use(
  (response) => {
    $store('app').setRequestCounter(-1);
    // 自动刷新令牌
    if (response.headers.Accesstoken) {
      $store('account').setToken(response.headers.Accesstoken);
    }
    // 导出&下载文件
    if (response.config.responseType === 'blob' && response.data.size > 0) {
      return Promise.resolve(response);
    }
    if (response.data.code !== '200') {
      // 处理认证失败
      if (AUTH_FAILURE_CODES.includes(response.data.code)) {
        handleAuthFailure(response);
        return Promise.reject(response);
      }
      if (response.config.options.showErrorMessage)
        ElMessage.error(response.data.message || '操作失败');
    } else {
      response.config.options.showSuccessMessage &&
        ElMessage.success(response.data.message || '操作成功');
    }
    return Promise.resolve(response.data);
  },
  (error) => {
    $store('app').setRequestCounter(-1);
    let errorMessage = '未知错误';
    if (!isNil(error.response)) {
      switch (error.response?.status) {
        case 400:
          errorMessage = '请求错误';
          break;
        case 401:
          handleAuthFailure(error.response.data);
          return Promise.reject(error.response);
        case 403:
          errorMessage = '拒绝访问';
          break;
        case 404:
          errorMessage = '请求出错';
          break;
        case 408:
          errorMessage = '请求超时';
          break;
        case 429:
          errorMessage = '请求频繁, 请稍后再访问';
          break;
        case 500:
          errorMessage = '服务器开小差了,请稍后再试~';
          break;
        case 501:
          errorMessage = '服务未实现';
          break;
        case 502:
          errorMessage = '网络错误';
          break;
        case 503:
          errorMessage = '服务不可用';
          break;
        case 504:
          errorMessage = '网络超时';
          break;
        case 505:
          errorMessage = 'HTTP版本不受支持';
          break;
      }
      ElMessage.error(error.response.data.message || errorMessage);
    } else {
      ElMessage.error(errorMessage);
    }
    return false;
  },
);
