/**
 * Copyright IBM Corp. 2024, 2025
 */

import axios, { AxiosError, AxiosRequestConfig, AxiosResponse } from 'axios';
import https from 'https';
import { HttpClient, HttpClientOpt } from './http-client.js';
const MAX_UPLOAD_SIZE = 20 * 1024 * 1024; // 20 MB

export class AxiosClient implements HttpClient {
  private getAgentConfig(validateSSL: boolean): Partial<AxiosRequestConfig> {
    return {
      httpsAgent: new https.Agent({
        rejectUnauthorized: validateSSL, // true = verify SSL, false = ignore SSL errors
      }),
    };
  }

  async request(
    options: HttpClientOpt,
    isFormDataAvailable: boolean = false,
  ): Promise<AxiosResponse | AxiosError> {
    const {
      method,
      url,
      headers = {},
      data,
      params,
      timeout = 10000, // default 10s timeout
      proxy,
      validateSSL = false,
      //   auth,
    } = options;
    const axiosConfig: AxiosRequestConfig = {
      method,
      url,
      headers: isFormDataAvailable
        ? { 'content-type': 'application/octet-stream' }
        : headers,
      ...(data !== undefined && { data }),
      ...(params && { params }),
      ...(timeout && { timeout }),
      ...(proxy && { proxy }),
      // ...(auth && { auth }),
      ...(url && this.getAgentConfig(validateSSL)),
      maxContentLength: MAX_UPLOAD_SIZE,
      maxBodyLength: MAX_UPLOAD_SIZE,
    };

    return await axios(axiosConfig);
  }
}
