import { AppError } from "./app-error";

export class BadRequestError extends AppError {
  constructor(
    message = "Bad request",
    errorCode = "BAD_REQUEST",
    details?: unknown,
  ) {
    super(message, 400, errorCode, true, details);
  }
}

export class UnauthorizedError extends AppError {
  constructor(
    message = "Unauthorized",
    errorCode = "UNAUTHORIZED",
    details?: unknown,
  ) {
    super(message, 401, errorCode, true, details);
  }
}

export class ForbiddenError extends AppError {
  constructor(
    message = "Forbidden",
    errorCode = "FORBIDDEN",
    details?: unknown,
  ) {
    super(message, 403, errorCode, true, details);
  }
}

export class NotFoundError extends AppError {
  constructor(
    message = "Resource not found",
    errorCode = "NOT_FOUND",
    details?: unknown,
  ) {
    super(message, 404, errorCode, true, details);
  }
}

export class ConflictError extends AppError {
  constructor(message = "Conflict", errorCode = "CONFLICT", details?: unknown) {
    super(message, 409, errorCode, true, details);
  }
}

export class UnprocessableEntityError extends AppError {
  constructor(
    message = "Unprocessable entity",
    errorCode = "UNPROCESSABLE_ENTITY",
    details?: unknown,
  ) {
    super(message, 422, errorCode, true, details);
  }
}

export class TooManyRequestsError extends AppError {
  constructor(
    message = "Too many requests",
    errorCode = "TOO_MANY_REQUESTS",
    details?: unknown,
  ) {
    super(message, 429, errorCode, true, details);
  }
}

export class InternalServerError extends AppError {
  constructor(
    message = "Internal server error",
    errorCode = "INTERNAL_SERVER_ERROR",
    details?: unknown,
  ) {
    super(message, 500, errorCode, false, details);
  }
}
