/**
 * HTTP Methods supported by the client
 */
export type HttpMethod =
  | 'GET'
  | 'POST'
  | 'PUT'
  | 'DELETE'
  | 'PATCH'
  | 'HEAD'
  | 'OPTIONS';

/**
 * Response types supported by the client
 */
export type ResponseType = 'json' | 'text' | 'binary' | 'stream';

/**
 * Form field data for multipart/form-data requests
 */
export interface FormField {
  name: string;
  value: string | Buffer;
  filename?: string;
  contentType?: string;
}

/**
 * URL encoded form field
 */
export interface UrlEncodedField {
  key: string;
  value: string;
}

/**
 * Retry configuration
 */
export interface RetryConfig {
  attempts: number; // Number of retry attempts
  initialDelay?: number; // Initial delay in ms
  maxDelay?: number; // Maximum delay in ms
  factor?: number; // Backoff factor
  statusCodes?: number[]; // Status codes to retry on
  shouldRetry?: (error: Error, attemptCount: number) => boolean;
}

/**
 * Timeout configuration
 */
export interface TimeoutConfig {
  request?: number; // Overall request timeout in ms
  connection?: number; // Connection timeout in ms
  socket?: number; // Socket idle timeout in ms
  response?: number; // Response timeout in ms
}

/**
 * Rate limit configuration for handling 429 responses
 */
export interface RateLimitConfig {
  maxRetries?: number; // Maximum number of retries (default: 3)
  respectRetryAfter?: boolean; // Respect Retry-After header (default: true)
  maxWaitTime?: number; // Max wait time in ms (default: 60000)
  fallbackDelay?: number; // Delay when no Retry-After header (default: 1000)
  backoffFactor?: number; // Exponential backoff factor (default: 2)
  onRateLimit?: (attempt: number, waitTime: number) => void; // Callback for rate limit events
}
