import axios from 'axios';
import { ElMessage } from 'element-plus';
import router from '@/router';

const BASE_URL = import.meta.env.VITE_API_BASE || 'http://localhost:8080';

const request = axios.create({
  baseURL: BASE_URL,
  timeout: 15000,
});

request.interceptors.request.use((config) => {
  const token = localStorage.getItem('admin_token');
  if (token) {
    config.headers['Authorization'] = `Bearer ${token}`;
  }
  return config;
});

/**
 * 统一响应拦截：除 401 外所有异常都给出错误提示。
 * 401 表示令牌失效/未登录，清除本地令牌并跳转登录页。
 */
request.interceptors.response.use(
  (resp) => resp.data,
  (error) => {
    const status = error.response?.status;
    if (status === 401) {
      localStorage.removeItem('admin_token');
      ElMessage.error('登录已失效，请重新登录');
      if (router.currentRoute.value.name !== 'Login') {
        router.replace({ name: 'Login' });
      }
    } else {
      ElMessage.error(error.response?.data?.message || error.message || '请求失败');
    }
    return Promise.reject(error);
  },
);

/**
 * 不携带任何鉴权头的请求实例，专用于登录等公开接口，
 * 避免把本地可能过期/失效的令牌误带上去造成 401 / 鉴权混乱。
 * 公开接口的 401 表示账号或密码错误，直接提示，不跳转（已在登录页）。
 */
export const publicRequest = axios.create({
  baseURL: BASE_URL,
  timeout: 15000,
});

publicRequest.interceptors.response.use(
  (resp) => resp.data,
  (error) => {
    const status = error.response?.status;
    if (status === 401) {
      ElMessage.error('登录失败，请检查账号或密码');
    } else {
      ElMessage.error(error.response?.data?.message || error.message || '请求失败');
    }
    return Promise.reject(error);
  },
);

export default request;

