import axios from "axios";
import { message } from "antd";

// 创建 axios 实例
const request = axios.create({
  baseURL: "/api",
  timeout: 10000,
});

// 请求拦截器
request.interceptors.request.use(
  (config) => {
    // 从 localStorage 获取 token
    const token = localStorage.getItem("token");

    // 如果有 token 则添加到请求头
    if (token) {
      config.headers["token"] = token;
    }


    console.log("发出的请求", config);
    return config;
  },
  (error) => {
    return Promise.reject(error);
  }
);


// 响应拦截器
request.interceptors.response.use(
  (response) => {
    return response.data;
  },
  (error) => {
    if (error.response) {
      const { status, data } = error.response;

      // 处理 401 未授权错误（token 无效或过期）
      if (status === 401) {
        message.error("登录已过期，请重新登录");

        // 清除本地存储的 token 和用户信息
        localStorage.removeItem("token");
        localStorage.removeItem("user");

        // 重定向到登录页
        if (window.location.pathname !== "/login") {
          window.location.href = "/login";
        }
      } else {
        // 处理其他错误
        // message.error(data.message || "11111请求失败");
        message.error(data.message || "11111请求失败");
      }
    } else if (error.request) {
      // 请求发出但没有收到响应
      message.error("网络错误，请检查您的网络连接");
    } else {
      // 请求配置出错
      message.error(error.message || "请求配置错误");
    }

    return Promise.reject(error);
  }
);

export default request; 