import axios from 'axios';
import { useAuthStore } from '../store/auth'; // 导入Auth Store
import router from '../router'; // 导入router实例，用于可能的编程式导航

const apiClient = axios.create({
  baseURL: 'http://127.0.0.1:8000/api/v1/', // 你的后端API基础URL
  headers: {
    'Content-Type': 'application/json',
  }
});

// 请求拦截器: 在每个请求发送前执行
apiClient.interceptors.request.use(
  (config) => {
    const authStore = useAuthStore(); // 在拦截器内部获取store实例
    const token = authStore.accessToken;
    if (token) {
      config.headers.Authorization = `Bearer ${token}`;
    }
    return config;
  },
  (error) => {
    return Promise.reject(error);
  }
);

// 响应拦截器: 在收到响应后执行
apiClient.interceptors.response.use(
  (response) => {
    // 对响应数据做点什么
    return response;
  },
  async (error) => {
    const originalRequest = error.config;
    const authStore = useAuthStore();

    // 如果是401错误 (Unauthorized)，并且不是因为正在刷新token而产生的错误，并且有refresh token
    if (error.response && error.response.status === 401 && !originalRequest._retry && authStore.refreshToken) {
      originalRequest._retry = true; // 标记为已重试，避免无限循环

      try {
        console.log('Access token expired or invalid, attempting to refresh...');
        // 注意: 刷新token的请求不应该使用会被拦截的 apiClient 实例，以避免循环拦截
        // 应该使用一个原始的 axios 实例或专门配置的不带拦截器的实例
        const rs = await axios.post('http://127.0.0.1:8000/api/v1/accounts/token/refresh/', {
          refresh: authStore.refreshToken,
        });

        const newAccessToken = rs.data.access;
        authStore.setAccessToken(newAccessToken); // 假设store有setAccessToken action

        // 更新原始请求的 Authorization header
        originalRequest.headers['Authorization'] = `Bearer ${newAccessToken}`;
        
        console.log('Token refreshed successfully, retrying original request.');
        return apiClient(originalRequest); // 用新的token重试原始请求
      } catch (refreshError) {
        console.error('Unable to refresh token:', refreshError.response ? refreshError.response.data : refreshError.message);
        authStore.logout(); // 刷新失败，登出用户
        router.push('/login').catch(() => {}); // 跳转到登录页，添加catch避免重复导航错误
        return Promise.reject(refreshError);
      }
    } else if (error.response && error.response.status === 401 && authStore.isAuthenticated) {
        // 如果是401但没有refresh token，或者刷新也失败了，直接登出
        console.log('401 Unauthorized, logging out user.');
        authStore.logout();
        router.push('/login').catch(() => {});
    }
    return Promise.reject(error);
  }
);

export default apiClient;