// 引入 axios 库，用于发起 HTTP 请求
import axios from 'axios';

// 设置默认的基础 URL，从环境变量中读取。
// VITE_APP_BASE_API 是在构建时通过 Vite 配置提供的环境变量。
axios.defaults.baseURL = import.meta.env.VITE_APP_BASE_API;

/**
 * 创建一个自定义的 axios 实例，允许我们设置全局配置。
 */
const service = axios.create({
  // 设置请求超时时间为 40 秒（40000 毫秒）
  timeout: 40000,

  // 设置默认的请求头信息
  headers: {
    'X-Requested-With': 'XMLHttpRequest', // 标识这是一个 AJAX 请求
    'Content-Type': 'application/json; charset=UTF-8' // 指定发送的数据类型为 JSON
  }
});

/**
 * 请求拦截器：在请求发送之前进行处理。
 * 可以用来添加认证令牌、修改请求配置等。
 */
service.interceptors.request.use(
  config => {
    // 在这里可以对 config 进行修改，例如添加 token 或其他头部信息
    // 示例：config.headers.Authorization = `Bearer ${token}`;

    // 返回配置对象或 Promise.resolve(config)
    return config;
  },
  error => {
    // 请求错误处理
    // 如果请求出错，在这里可以做些事情，比如日志记录

    // 返回错误或 Promise.reject(error)
    return Promise.reject(error);
  }
);

/**
 * 响应拦截器：在接收到响应数据之后进行处理。
 * 可以用来统一处理响应错误、解析响应数据等。
 */
service.interceptors.response.use(
  response => {
    // 默认情况下只返回响应体中的 data 字段
    // 如果需要更多响应信息，可以直接返回整个 response 对象

    return response.data;
  },
  error => {
    // 响应错误处理
    // 如果服务器返回错误状态码（如 4xx 或 5xx），在这里可以进行全局错误处理
    // 例如显示错误消息给用户或者跳转到错误页面

    // 返回错误或 Promise.reject(error)
    return Promise.reject(error);
  }
);

// 导出 service 实例，以便其他模块可以引用它来发起 HTTP 请求
export default service;
