__all__ = (
    "ImmediateException",
    "LimitException",
    "APIRateLimitException",
    "RateLimitExceededException",
    "OperationInterrupted",
    "PluginMutationRejectedError",
    "StorageQueryError",
    "TMDbException",
)


class ImmediateException(Exception):
    """
    用于立即抛出异常而不重试的特殊异常类。
    当不希望使用重试机制时，可以抛出此异常。
    """
    pass


class LimitException(ImmediateException):
    """
    用于表示本地限流器或外部触发的限流异常的基类。
    该异常类可用于本地限流逻辑或外部限流处理。
    """
    pass


class APIRateLimitException(LimitException):
    """
    用于表示API速率限制的异常类。
    当API调用触发速率限制时，可以抛出此异常以立即终止操作并报告错误。
    """
    pass


class RateLimitExceededException(LimitException):
    """
    用于表示本地限流器触发的异常类。
    当函数调用频率超过限流器的限制时，可以抛出此异常以停止当前操作并告知调用者限流情况。
    这个异常通常用于本地限流逻辑（例如 RateLimiter），当系统检测到函数调用频率过高时，触发限流并抛出该异常。
    """
    pass


class OperationInterrupted(KeyboardInterrupt):
    """
    用于表示操作被中断
    """
    pass


class PluginMutationRejectedError(RuntimeError):
    """表示插件运行时已封口，新的可变事务未获准执行。"""

    def __init__(self, operation: str) -> None:
        """保存被拒绝的操作名称并生成稳定诊断消息。"""
        self.operation = operation
        super().__init__(f"插件运行时已进入停机阶段，拒绝{operation}")


class StorageQueryError(Exception):
    """
    用于表示存储查询无法确认结果的异常类。
    当文件信息查询因网络、限流或接口错误失败（区别于「确认不存在」）时抛出，
    调用方不应把该状态当作文件不存在处理。
    """
    pass


class PersistenceUnavailableError(RuntimeError):
    """持久化执行能力暂时拒绝新操作，调用方可在稍后重试。"""


class DatabaseWorkerClosedError(PersistenceUnavailableError):
    """数据库执行器尚未启动或已经停止。"""


class DatabaseWorkerOverloadedError(PersistenceUnavailableError):
    """数据库执行器的运行与排队容量已经用尽。"""


class AgentChatPersistenceUnavailableError(PersistenceUnavailableError):
    """AgentChat 持久化服务因关闭或自身容量限制拒绝新写入。"""


class TMDbException(Exception):
    """
    用于表示TheMovieDB数据源请求失败的跨层异常契约。
    具体实现由TMDB模块内的异常子类继承本类，链层与API层只捕获本基类，
    不依赖模块内部实现路径。
    """
    pass
