import axios from "axios";
import { ElMessage, ElMessageBox } from "element-plus";
import router from "@/router/index";

// 创建 axios 实例
const service = axios.create({
  // 基础路径，对应后端接口前缀（根据你的项目修改）
  // baseURL: import.meta.env.VITE_API_BASE_URL,
  // 请求超时时间
  timeout: 10000,
});


// ===================== 请求拦截器（发送请求前做的事） =====================
// 作用：给所有请求头添加 Token，供后端校验身份
service.interceptors.request.use(
  (config) => {
    // 1. 从 localStorage 获取 Token（登录时存入的）
    const token = sessionStorage.getItem("token");
    // 2. 如果有 Token，添加到请求头（后端要通过这个头获取 Token）
    if (token) {
      config.headers["token"] = `${token}`;
    }
    // 3. 设置请求头格式（默认 JSON）
    // if (!config.headers['Content-Type']) {
    //   config.headers['Content-Type'] = 'application/json;charset=utf-8'
    // }
    return config;
  },
  (error) => {
    // 请求出错时的处理（比如网络错误）
    console.error("请求拦截器错误：", error);
    return Promise.reject(error);
  },
);

// ===================== 响应拦截器（收到后端响应后做的事） =====================
// 作用：统一处理后端返回结果，简化组件内的调用逻辑
service.interceptors.response.use(
  (response) => {
    // console.log(response);
    if (response.data.message == "登录凭证已失效，请重新登录") {
      router.push("/login");
    } 
      // 1. 获取后端返回的数据（response.data 是后端真正返回的内容）
      const res = response.data;
      return res;
  },
  (error) => {
    // 3. 处理 HTTP 状态码错误（比如 401 未登录、403 权限不足、500 服务器错误）
    console.error("响应拦截器错误：", error);
    let msg = "";
    // 获取 HTTP 状态码
    const status = error.response?.status || 0;
    switch (status) {
      case 401:
        // 401：Token 过期/无效 → 提示用户，清除 Token，跳登录页
        msg = "登录已过期，请重新登录";
        localStorage.removeItem("token");
        router.push("/login");
        break;
      case 403:
        // 403：权限不足 → 提示用户
        msg = "权限不足，无法操作";
        break;
      case 500:
        // 500：服务器内部错误 → 提示用户
        msg = "服务器内部错误，请稍后重试";
        break;
      default:
        // 其他错误：默认提示
        msg = error.message || "请求出错，请稍后重试";
    }
    // 弹出错误提示
    ElMessage.error(msg);
    // 抛出错误
    return Promise.reject(error);
  },
);

// 导出封装好的 axios 实例
export default service;
