import axios, { AxiosInstance, CreateAxiosDefaults } from "axios";
import { setupInterceptors } from "./setup-interceptors";

/**
 * Configuración necesaria para crear una instancia de Axios personalizada.
 */
export interface AxiosFactoryConfig {
  /** URL base del backend API. */
  baseURL: string;

  /**
   * Función que retorna el token JWT actual.
   * Debe devolver `null` si no hay token disponible.
   */
  getAccessToken: () => string | null;

  /**
   * Función opcional que se ejecuta cuando ocurre un error de autenticación (por ejemplo, 401).
   */
  onAuthError?: () => void;
}

export const defaultAxiosRequestConfig: CreateAxiosDefaults = {
  headers: {
    Accept: "application/json",
    "Content-Type": "application/json; charset=utf-8",
    "Cache-Control": "no-cache",
    "Access-Control-Allow-Origin": "*", // Could work and fix the previous problem, but not in all APIs
  },
};

/**
 * Crea una instancia de Axios preconfigurada con interceptores.
 *
 * @param config - Configuración necesaria para inicializar Axios correctamente.
 * @returns Instancia de Axios lista para usarse.
 */
export const createAxiosInstance = ({
  baseURL,
  getAccessToken,
  onAuthError,
}: AxiosFactoryConfig): AxiosInstance => {
  const instance = axios.create(defaultAxiosRequestConfig);
  instance.defaults.baseURL = baseURL;

  return setupInterceptors(instance, getAccessToken, onAuthError);
};
