// src/api/auth.js
import axios from 'axios';

// 创建并导出 axios 实例
export const api = axios.create({
  baseURL: 'http://team2.10813352.xyz:8088',
  timeout: 5000,
});

// 请求拦截器
api.interceptors.request.use(config => {
  const token = localStorage.getItem('token');
  if (token) {
    config.headers.Authorization = `Bearer ${token}`;
  }
  return config;
});

export const login = async (username, password) => {
  const response = await api.post('/user/login', null, {
    params: { username, password }
  });
  if (response.data.code === 200 && response.data.data.token) {
    localStorage.setItem('token', response.data.data.token);
  }
  return response;
};

export const register = (username, password, code) => {
  return api.post('/user/regist', null, {
    params: { username, password, code }
  });
};

export const getUserInfo = async () => {
  try {
    const response = await api.get('/user/userInfo');
    if (response.data.code === 200) {
      return response.data.data; 
    }
    throw new Error(response.data.message || '获取用户信息失败');
  } catch (error) {
    console.error('获取用户信息失败:', error);
    throw error;
  }
};

export const isAdmin = async () => {
  try {
    const userInfo = await getUserInfo();
    return userInfo.authority === 'ADMIN';
  } catch (error) {
    console.error('检查管理员权限失败:', error);
    return false;
  }
};
