"use client";

import axios, { AxiosInstance, InternalAxiosRequestConfig } from "axios";

const axiosInstance: AxiosInstance = axios.create({
  baseURL: "/api", // adjust if you call external APIs too
  timeout: 30000,
});

// Queue + lock, same concept as your React app's global request queue.
let isLocked = false;
const queue: Array<() => void> = [];

const processQueue = () => {
  if (queue.length === 0) {
    isLocked = false;
    return;
  }

  isLocked = true;
  const next = queue.shift();
  next?.();
};

axiosInstance.interceptors.request.use(
  (config: InternalAxiosRequestConfig) => {
    return new Promise((resolve) => {
      const runRequest = () => resolve(config);

      if (isLocked) {
        queue.push(runRequest);
      } else {
        isLocked = true;
        runRequest();
      }
    });
  },
  (error) => Promise.reject(error)
);

axiosInstance.interceptors.response.use(
  (response) => {
    processQueue();
    return response;
  },
  (error) => {
    processQueue();
    return Promise.reject(error);
  }
);

export default axiosInstance;