import axios from 'axios';
import { apiQueue } from '../utils/requestQueue';

const API_BASE_URL = window.location.origin;

const apiClient = axios.create({
  baseURL: API_BASE_URL,
  headers: {
    'Content-Type': 'application/json',
  },
  withCredentials: true, // Важно для работы с cookies/сессиями
});

// Интерцептор запросов для добавления в очередь (только для POST запросов к стейкингу)
apiClient.interceptors.request.use(
  async (config) => {
    // Проверяем, является ли это запросом к API стейкинга
    const isStakingRequest = config.url?.includes('/api/staking/') && 
                            (config.method === 'post' || config.method === 'POST');
    
    // Если это запрос стейкинга, добавляем в очередь
    if (isStakingRequest) {
      // Сохраняем конфигурацию для использования в очереди
      config._queuedRequest = true;
    }
    
    return config;
  },
  (error) => {
    return Promise.reject(error);
  }
);

apiClient.interceptors.response.use(
  (response) => response,
  async (error) => {
    console.error('API Error:', error);
    
    // Если получили 429 (Too Many Requests), показываем понятное сообщение
    if (error.response?.status === 429) {
      const customError = new Error('Слишком много запросов. Пожалуйста, подождите немного.');
      customError.response = error.response;
      return Promise.reject(customError);
    }
    
    return Promise.reject(error);
  }
);

// Обертка для добавления запросов в очередь
const createQueuedClient = (client) => {
  const queuedClient = {
    get: (...args) => client.get(...args),
    post: (url, data, config) => {
      // Если это запрос стейкинга, добавляем в очередь
      if (url?.includes('/api/staking/')) {
        return apiQueue.add(() => client.post(url, data, config));
      }
      return client.post(url, data, config);
    },
    put: (...args) => client.put(...args),
    delete: (...args) => client.delete(...args),
    patch: (...args) => client.patch(...args),
  };
  
  return queuedClient;
};

export default createQueuedClient(apiClient);
