import axios, { AxiosInstance, AxiosRequestConfig, AxiosResponse } from "axios";

export interface AxiosClientOptions extends AxiosRequestConfig {
  /** Tiempo por defecto de timeout en ms */
  timeout?: number;
}

export class AxiosClient {
  private client: AxiosInstance;

  constructor(config?: AxiosClientOptions) {
    this.client = axios.create({
      timeout: config?.timeout || 5000,
      ...config,
    });
  }

  /** Realiza una petición GET y retorna los datos */
  async get<T>(url: string, config?: AxiosRequestConfig): Promise<T> {
    const response: AxiosResponse<T> = await this.client.get<T>(url, config);
    return response.data;
  }

  /** Realiza una petición POST con datos y retorna los datos */
  async post<T>(
    url: string,
    data?: any,
    config?: AxiosRequestConfig
  ): Promise<T> {
    const response: AxiosResponse<T> = await this.client.post<T>(
      url,
      data,
      config
    );
    return response.data;
  }

  /** Realiza una petición PUT y retorna los datos */
  async put<T>(
    url: string,
    data?: any,
    config?: AxiosRequestConfig
  ): Promise<T> {
    const response: AxiosResponse<T> = await this.client.put<T>(
      url,
      data,
      config
    );
    return response.data;
  }

  /** Realiza una petición DELETE y retorna los datos */
  async delete<T>(url: string, config?: AxiosRequestConfig): Promise<T> {
    const response: AxiosResponse<T> = await this.client.delete<T>(url, config);
    return response.data;
  }
}
