import axios from 'axios';
import { ElMessage } from 'element-plus';
import { useUserStore } from '../store/user';
import router from '../router';

const service = axios.create({
  // 开发环境默认走 Vite /api 代理，生产环境可用环境变量覆盖。
  baseURL: import.meta.env.VITE_API_BASE_URL || '/api',
  timeout: 10000,
});

// 请求拦截：统一挂载 Bearer Token，避免各页面重复拼接鉴权头。
service.interceptors.request.use(
  (config) => {
    const userStore = useUserStore();
    if (userStore.token) {
      config.headers['Authorization'] = `Bearer ${userStore.token}`;
    }
    return config;
  },
  (error) => {
    return Promise.reject(error);
  },
);

// 响应拦截：对齐后端统一响应包裹 { code, msg, data }。
service.interceptors.response.use(
  (response) => {
    const res = response.data;

    // 后端成功响应统一为 code=0；这里兼容少量 code=2xx 的历史结构。
    if (res.code === 0 || (res.code >= 200 && res.code < 300)) {
      return res.data;
    } else {
      ElMessage.error(res.msg || '请求失败');
      return Promise.reject(new Error(res.msg || 'Error'));
    }
  },
  (error) => {
    const userStore = useUserStore();
    let message = error.message;

    if (error.response) {
      const { status, data } = error.response;
      message = data?.msg || message;

      if (status === 401) {
        // 401 统一视为登录态失效，先清理本地态再跳登录页。
        userStore.logout();
        router.push(
          `/login?redirect=${encodeURIComponent(router.currentRoute.value.fullPath)}`,
        );
        ElMessage.error(message || '登录状态已过期，请重新登录');
        return Promise.reject(new Error('Unauthorized'));
      } else if (status === 403) {
        ElMessage.error(message || '没有权限执行该操作');
      } else {
        ElMessage.error(message || '请求失败');
      }
    } else {
      ElMessage.error(message || '网络连接异常');
    }
    return Promise.reject(error);
  },
);

export default service;
