"""Pipeline package exports.

This module intentionally avoids eager imports of all pipeline stage modules to
prevent import-time cycles. Stage classes remain available via lazy attribute
resolution for backward compatibility.
"""

from __future__ import annotations

from importlib import import_module
from typing import TYPE_CHECKING, Any

from astrbot.core.message.message_event_result import (
    EventResultType,
    MessageEventResult,
)

from .stage_order import STAGES_ORDER

if TYPE_CHECKING:
    from .content_safety_check.stage import ContentSafetyCheckStage
    from .preprocess_stage.stage import PreProcessStage
    from .process_stage.stage import ProcessStage
    from .rate_limit_check.stage import RateLimitStage
    from .respond.stage import RespondStage
    from .result_decorate.stage import ResultDecorateStage
    from .session_status_check.stage import SessionStatusCheckStage
    from .waking_check.stage import WakingCheckStage
    from .whitelist_check.stage import WhitelistCheckStage

_LAZY_EXPORTS = {
    "ContentSafetyCheckStage": (
        "astrbot.core.pipeline.content_safety_check.stage",
        "ContentSafetyCheckStage",
    ),
    "PreProcessStage": (
        "astrbot.core.pipeline.preprocess_stage.stage",
        "PreProcessStage",
    ),
    "ProcessStage": (
        "astrbot.core.pipeline.process_stage.stage",
        "ProcessStage",
    ),
    "RateLimitStage": (
        "astrbot.core.pipeline.rate_limit_check.stage",
        "RateLimitStage",
    ),
    "RespondStage": (
        "astrbot.core.pipeline.respond.stage",
        "RespondStage",
    ),
    "ResultDecorateStage": (
        "astrbot.core.pipeline.result_decorate.stage",
        "ResultDecorateStage",
    ),
    "SessionStatusCheckStage": (
        "astrbot.core.pipeline.session_status_check.stage",
        "SessionStatusCheckStage",
    ),
    "WakingCheckStage": (
        "astrbot.core.pipeline.waking_check.stage",
        "WakingCheckStage",
    ),
    "WhitelistCheckStage": (
        "astrbot.core.pipeline.whitelist_check.stage",
        "WhitelistCheckStage",
    ),
}

# Type-checking imports to satisfy static analyzers for __all__ exports
if TYPE_CHECKING:
    from .content_safety_check.stage import ContentSafetyCheckStage
    from .preprocess_stage.stage import PreProcessStage
    from .process_stage.stage import ProcessStage
    from .rate_limit_check.stage import RateLimitStage
    from .respond.stage import RespondStage
    from .result_decorate.stage import ResultDecorateStage
    from .session_status_check.stage import SessionStatusCheckStage
    from .waking_check.stage import WakingCheckStage
    from .whitelist_check.stage import WhitelistCheckStage

__all__ = [
    "ContentSafetyCheckStage",
    "EventResultType",
    "MessageEventResult",
    "PreProcessStage",
    "ProcessStage",
    "RateLimitStage",
    "RespondStage",
    "ResultDecorateStage",
    "SessionStatusCheckStage",
    "STAGES_ORDER",
    "WakingCheckStage",
    "WhitelistCheckStage",
]


def __getattr__(name: str) -> Any:
    if name not in _LAZY_EXPORTS:
        raise AttributeError(f"module {__name__!r} has no attribute {name!r}")
    module_path, attr_name = _LAZY_EXPORTS[name]
    module = import_module(module_path)
    value = getattr(module, attr_name)
    globals()[name] = value
    return value


def __dir__() -> list[str]:
    return sorted(set(globals()) | set(__all__))
