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

// 创建 axios 实例
const request = axios.create({
  baseURL: "http://192.168.10.174:8080/api",
  // baseURL: "http://localhost:8080/api",
  // baseURL: "http://192.168.241.173:8080/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) => {
    console.log("响应数据", 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 || "111111111");
      }
    } else if (error.request) {
      // 请求发出但没有收到响应
      message.error("网络错误，请检查您的网络连接");
    } else {
      // 请求配置出错
      message.error(error.message || "请求配置错误");
    }

    return Promise.reject(error);
  }
);

export default request; 