from typing import Any, Optional


class AppException(Exception):
    def __init__(
        self,
        message: str,
        status_code: int = 500,
        errors: Optional[list] = None,
    ):
        self.message = message
        self.status_code = status_code
        self.errors = errors or []
        super().__init__(self.message)


class NotFoundError(AppException):
    def __init__(self, message: str = "Resource not found"):
        super().__init__(message=message, status_code=404)


class UnauthorizedError(AppException):
    def __init__(self, message: str = "Authentication required"):
        super().__init__(message=message, status_code=401)


class ForbiddenError(AppException):
    def __init__(self, message: str = "Insufficient permissions"):
        super().__init__(message=message, status_code=403)


class ValidationError(AppException):
    def __init__(self, message: str = "Validation failed", errors: Optional[list] = None):
        super().__init__(message=message, status_code=422, errors=errors or [])


class ConflictError(AppException):
    def __init__(self, message: str = "Resource already exists"):
        super().__init__(message=message, status_code=409)


class TenantNotFoundError(AppException):
    def __init__(self, message: str = "Cemetery not found"):
        super().__init__(message=message, status_code=404)


class TenantSuspendedError(AppException):
    def __init__(self, message: str = "Account is suspended"):
        super().__init__(message=message, status_code=403)
