"""CascadeDetector - 独立的级联故障检测工具（委托给 CascadeStateStore）"""

from __future__ import annotations

from dataclasses import dataclass

from agentkit.quality.cascade_state_store import (
    CascadeStateStore,
    InMemoryCascadeStateStore,
)


@dataclass
class CascadeAlert:
    """级联故障告警"""

    session_id: str
    alert_type: str  # "interaction_limit" or "loop_depth"
    current_value: int
    threshold: int
    message: str


class CascadeDetector:
    """检测多 agent 交互中的级联故障"""

    def __init__(
        self,
        max_interactions: int = 10,
        max_depth: int = 3,
        store: CascadeStateStore | None = None,
    ):
        self._max_interactions = max_interactions
        self._max_depth = max_depth
        self._store: CascadeStateStore = store or InMemoryCascadeStateStore()

    def check_interaction(self, session_id: str) -> CascadeAlert | None:
        """递增并检查交互计数"""
        count = self._store.increment_interaction(session_id)
        if count > self._max_interactions:
            return CascadeAlert(
                session_id=session_id,
                alert_type="interaction_limit",
                current_value=count,
                threshold=self._max_interactions,
                message=(
                    f"Session {session_id} exceeded max interactions: "
                    f"{count} > {self._max_interactions}"
                ),
            )
        return None

    def check_depth(self, session_id: str, depth: int) -> CascadeAlert | None:
        """检查循环深度"""
        self._store.set_depth(session_id, depth)
        if depth > self._max_depth:
            return CascadeAlert(
                session_id=session_id,
                alert_type="loop_depth",
                current_value=depth,
                threshold=self._max_depth,
                message=(
                    f"Session {session_id} exceeded max loop depth: "
                    f"{depth} > {self._max_depth}"
                ),
            )
        return None

    def reset(self, session_id: str) -> None:
        """重置某个 session 的计数器"""
        self._store.reset(session_id)

    def get_stats(self, session_id: str) -> dict[str, int]:
        """获取某个 session 的当前统计"""
        return {
            "interactions": self._store.get_interaction(session_id),
            "depth": self._store.get_depth(session_id),
        }
