export class HttpClientError extends Error {
  public readonly status?: number;
  public readonly data?: any;
  public readonly headers?: any;

  constructor(message?: string, response?: { status: number; headers?: any }, data?: any) {
    super(message ?? `Unexpected status code: ${response?.status}`);
    this.status = response?.status;
    this.data = data;
    this.headers = response?.headers;
    Error.captureStackTrace(this, this.constructor);
  }

  /**
   * Parses the Retry-After header and returns the value in milliseconds.
   * @param maxDelay
   * @param error
   * @throws {HttpClientError} if retry-after is bigger than maxDelay.
   * @returns the retry-after value in milliseconds.
   */
  public getRetryAfter(maxDelay: number, error: HttpClientError): number | undefined {
    const retryAfter = this.headers?.get("Retry-After");
    if (retryAfter) {
      const value = parseInt(retryAfter) * 1000; // header value is in seconds
      if (value <= maxDelay) {
        return value;
      }

      throw error;
    }
  }
}
