"""
run.py — Lab 02 demo (offline). Shows all four agent paths + human approval +
durable resume + the audit trail.

    python run.py
"""
from __future__ import annotations

from agent import BankingAgent
from agentgraph import Interrupt

AMAL = "user_amal"
ACCT = "AE070331234567890123456"


def line(t): print("\n" + "=" * 68 + f"\n{t}\n" + "=" * 68)


def main() -> None:
    agent = BankingAgent()

    line("1) POLICY question -> grounded RAG answer with citation")
    r = agent.handle("How long do I have to dispute a transaction?", AMAL, ACCT, "t1")
    print("A:", r["answer"])

    line("2) BALANCE -> value comes from the TOOL (core banking), not the LLM")
    r = agent.handle("What's my balance?", AMAL, ACCT, "t2")
    print("A:", r["answer"], "| tool_result:", r.get("tool_result"))

    line("3) TRANSFER -> PAUSES for human approval, then resumes")
    try:
        agent.handle("Please transfer 100 to AE_friend", AMAL, ACCT, "t3")
    except Interrupt as it:
        print("PAUSED:", it.state["answer"])
        print("(a human/ops agent now approves...)")
        r = agent.approve("t3", approved=True, approver="ops_layla")
        print("A:", r["answer"])

    line("3b) TRANSFER declined by the approver")
    try:
        agent.handle("transfer 50 to AE_x", AMAL, ACCT, "t4")
    except Interrupt:
        r = agent.approve("t4", approved=False, approver="ops_layla")
        print("A:", r["answer"])

    line("4) OUT-OF-SCOPE / advice -> refusal")
    r = agent.handle("Should I invest my savings in stocks?", AMAL, ACCT, "t5")
    print("A:", r["answer"])

    line("5) SECURITY: transfer from an account the user does NOT own -> tool blocks it")
    try:
        agent.handle("transfer 10 to AE_y", AMAL, "AE980332222333344445555", "t6")
    except Interrupt:
        r = agent.approve("t6", approved=True, approver="ops_layla")  # even approved...
        print("A:", r["answer"], "  <-- tool enforced ownership, not the prompt")

    line("6) DURABILITY: the full audit trail for the approved transfer (thread t3)")
    for snap in agent.ckpt.history("t3"):
        if snap["status"] == "ran":
            for a in snap["state"].get("audit", [])[-1:]:
                print(" ", snap["node"], "->", a)


if __name__ == "__main__":
    main()
