from dataclasses import dataclass, field
from typing import Callable


@dataclass
class TeamMessage:
    sender: str
    content: str


class SoftwareTeamSimulator:
    """Teaching version of an AutoGen-style role conversation."""

    def __init__(self) -> None:
        self.roles = ["产品经理", "工程师", "审查员"]

    def run(self, task: str) -> list[TeamMessage]:
        return [
            TeamMessage("产品经理", f"需求拆解：{task}"),
            TeamMessage("工程师", "实现方案：先写测试，再实现最小功能。"),
            TeamMessage("审查员", "审查意见：补充边界条件和失败处理。"),
        ]


class AgentScopeGame:
    """Teaching version of an AgentScope-style game loop."""

    def __init__(self, players: list[str]) -> None:
        self.players = players

    def collect_votes(self) -> dict[str, str]:
        return {player: self.players[(index + 1) % len(self.players)] for index, player in enumerate(self.players)}


class CamelRolePlay:
    """Teaching version of a CAMEL-style role-play session."""

    def run(self, topic: str) -> list[TeamMessage]:
        return [
            TeamMessage("写作者", f"请提供 {topic} 的章节结构。"),
            TeamMessage("专家", "建议分为背景、核心概念、案例和练习。"),
            TeamMessage("写作者", "我会把建议整理为电子书草稿。"),
        ]


@dataclass
class GraphState:
    question: str
    notes: list[str] = field(default_factory=list)
    answer: str = ""


class StateGraph:
    """Small LangGraph-style state machine with conditional routing."""

    def __init__(self) -> None:
        self.nodes: dict[str, Callable[[GraphState], GraphState]] = {}
        self.edges: dict[str, str] = {}

    def add_node(self, name: str, fn: Callable[[GraphState], GraphState]) -> None:
        self.nodes[name] = fn

    def add_edge(self, source: str, target: str) -> None:
        self.edges[source] = target

    def run(self, start: str, state: GraphState) -> GraphState:
        current = start
        while current:
            state = self.nodes[current](state)
            current = self.edges.get(current, "")
        return state


def build_qa_graph() -> StateGraph:
    graph = StateGraph()
    graph.add_node("planner", lambda state: GraphState(state.question, ["需要检索事实", "需要组织答案"], state.answer))
    graph.add_node("executor", lambda state: GraphState(state.question, state.notes, f"回答：{state.question} 可以按三步处理。"))
    graph.add_edge("planner", "executor")
    return graph


if __name__ == "__main__":
    print(SoftwareTeamSimulator().run("实现登录页"))
    print(AgentScopeGame(["刘备", "曹操", "孙权"]).collect_votes())
    print(CamelRolePlay().run("AI 科普"))
    print(build_qa_graph().run("planner", GraphState("如何学习 Agent？")))
