"""LangGraph 审批恢复教学例子：内存状态、模拟回执，没有真实退款。"""
from dataclasses import asdict
from typing import TypedDict
from langgraph.checkpoint.memory import InMemorySaver
from langgraph.graph import END, START, StateGraph
from langgraph.types import Command, interrupt
from approval_runtime import Approval, Draft, Ledger, approve


class ToolState(TypedDict):
    draft: dict
    approval: dict
    result: dict


ledger = Ledger()


def review(state: ToolState) -> dict:
    # interrupt 前只准备展示数据，不进行外部写操作，因为恢复会重跑节点。
    draft = Draft(**state["draft"])
    decision = interrupt({"action": "submit_refund", "draft": asdict(draft)})
    # 使用真实时钟判断有效期；批准响应仍需由外部可信审批端传入。
    import time
    approved = approve(draft, decision, now=time.time())
    return {"approval": asdict(approved)}


def execute(state: ToolState) -> dict:
    import time
    approval = Approval(**state["approval"])
    if not approval.approved:
        return {"result": {"status": "rejected"}}
    # 下面两个 True 是明确的教学占位；生产应重新查权限与业务状态。
    result = ledger.submit(Draft(**state["draft"]), approval, now=time.time(),
                           authorized=True, eligible=True)
    return {"result": result}


builder = StateGraph(ToolState)
builder.add_node("review", review)
builder.add_node("execute", execute)
builder.add_edge(START, "review")
builder.add_edge("review", "execute")
builder.add_edge("execute", END)
graph = builder.compile(checkpointer=InMemorySaver())


if __name__ == "__main__":
    draft = Draft("shop-a", "user-417", "refund-op-9", "A1042", 10000)
    config = {"configurable": {"thread_id": "review-refund-op-9"}}
    paused = graph.invoke({"draft": asdict(draft), "approval": {}, "result": {}}, config)
    print(paused["__interrupt__"][0].value)
    # 固定 True 模拟人工批准，不是实现了真实审批界面或身份验证。
    completed = graph.invoke(Command(resume={"approved": True}), config)
    print(completed["result"])
