from typing import Any class AppError(Exception): def __init__(self, code: str, message: str, status_code: int = 400, details: Any = None): self.code = code self.message = message self.status_code = status_code self.details = details super().__init__(message) class NotFoundError(AppError): def __init__(self, resource: str, details: Any = None): code = f"{resource.upper().replace(' ', '_')}_NOT_FOUND" message = f"{resource.replace('_', ' ').capitalize()} not found" super().__init__(code=code, message=message, status_code=404, details=details) class UnauthorizedError(AppError): def __init__(self, message: str = "Authentication required"): super().__init__(code="UNAUTHORIZED", message=message, status_code=401) class ForbiddenError(AppError): def __init__(self, message: str = "Insufficient permissions"): super().__init__(code="FORBIDDEN", message=message, status_code=403) class ConflictError(AppError): def __init__(self, code: str, message: str, details: Any = None): super().__init__(code=code, message=message, status_code=409, details=details) class PaymentError(AppError): def __init__(self, message: str, details: Any = None): super().__init__(code="PAYMENT_FAILED", message=message, status_code=402, details=details) class ValidationError(AppError): def __init__(self, message: str, details: Any = None): super().__init__(code="VALIDATION_ERROR", message=message, status_code=422, details=details) class OutOfStockError(AppError): def __init__(self, product_name: str = ""): msg = f"'{product_name}' is out of stock" if product_name else "One or more items are out of stock" super().__init__(code="OUT_OF_STOCK", message=msg, status_code=409) class SlotUnavailableError(AppError): def __init__(self): super().__init__(code="SLOT_UNAVAILABLE", message="This time slot is no longer available", status_code=409) class UserBlockedError(AppError): def __init__(self): super().__init__(code="USER_BLOCKED", message="Your account has been suspended", status_code=403)