/**
 * Custom API Error class
 * Base class for API-related errors
 */
export class ApiError extends Error {
  statusCode: number;
  code: string;
  details?: any;

  /**
   * Create a new API error
   * @param message Error message
   * @param statusCode HTTP status code
   * @param code Error code for client
   * @param details Additional error details
   */
  constructor(
    message: string,
    statusCode: number = 500,
    code: string = 'INTERNAL_SERVER_ERROR',
    details?: any
  ) {
    super(message);
    this.statusCode = statusCode;
    this.code = code;
    this.details = details;
    this.name = this.constructor.name;
    Error.captureStackTrace(this, this.constructor);
  }

  /**
   * Create a Bad Request error (400)
   * @param message Error message
   * @param code Custom error code
   * @param details Additional error details
   */
  static badRequest(message: string, code: string = 'BAD_REQUEST', details?: any): ApiError {
    return new ApiError(message, 400, code, details);
  }

  /**
   * Create an Unauthorized error (401)
   * @param message Error message
   * @param code Custom error code
   * @param details Additional error details
   */
  static unauthorized(message: string, code: string = 'UNAUTHORIZED', details?: any): ApiError {
    return new ApiError(message, 401, code, details);
  }

  /**
   * Create a Forbidden error (403)
   * @param message Error message
   * @param code Custom error code
   * @param details Additional error details
   */
  static forbidden(message: string, code: string = 'FORBIDDEN', details?: any): ApiError {
    return new ApiError(message, 403, code, details);
  }

  /**
   * Create a Not Found error (404)
   * @param message Error message
   * @param code Custom error code
   * @param details Additional error details
   */
  static notFound(message: string, code: string = 'NOT_FOUND', details?: any): ApiError {
    return new ApiError(message, 404, code, details);
  }

  /**
   * Create a Conflict error (409)
   * @param message Error message
   * @param code Custom error code
   * @param details Additional error details
   */
  static conflict(message: string, code: string = 'CONFLICT', details?: any): ApiError {
    return new ApiError(message, 409, code, details);
  }

  /**
   * Create a Validation Error (422)
   * @param message Error message
   * @param code Custom error code
   * @param details Validation error details
   */
  static validation(message: string, code: string = 'VALIDATION_ERROR', details?: any): ApiError {
    return new ApiError(message, 422, code, details);
  }

  /**
   * Create a Too Many Requests error (429)
   * @param message Error message
   * @param code Custom error code
   * @param details Additional error details
   */
  static tooManyRequests(message: string, code: string = 'TOO_MANY_REQUESTS', details?: any): ApiError {
    return new ApiError(message, 429, code, details);
  }

  /**
   * Create an Internal Server Error (500)
   * @param message Error message
   * @param code Custom error code
   * @param details Additional error details
   */
  static internal(message: string, code: string = 'INTERNAL_SERVER_ERROR', details?: any): ApiError {
    return new ApiError(message, 500, code, details);
  }
}
