class AppError(Exception):
    """Base application error. Carries an HTTP status and a message key."""

    status_code = 400

    def __init__(self, message: str, errors: list[str] | None = None) -> None:
        super().__init__(message)
        self.message = message
        self.errors = errors or []


class ValidationError(AppError):
    status_code = 422


class NotFoundError(AppError):
    status_code = 404


class UnauthorizedError(AppError):
    status_code = 401


class ForbiddenError(AppError):
    status_code = 403


class ConflictError(AppError):
    status_code = 409


class PaymentError(AppError):
    status_code = 400


class ExternalServiceError(AppError):
    status_code = 502
