"""Run with RUNNER/mcp/.venv/bin/python mcp_debug_session.py /path/to/RUNNER."""
import asyncio
import json
from pathlib import Path
import sys

from mcp import ClientSession, StdioServerParameters
from mcp.client.stdio import stdio_client


def result_value(result):
    if result.isError:
        raise RuntimeError(result.content)
    if result.structuredContent is not None:
        return result.structuredContent
    return json.loads(next(item.text for item in result.content if item.type == "text"))


async def main(runner_dir):
    runner = Path(runner_dir).expanduser().resolve()
    server = StdioServerParameters(
        command=str(runner / "mcp/.venv/bin/python"),
        args=[str(runner / "mcp/server.py")],
    )
    async with stdio_client(server) as (read, write):
        async with ClientSession(read, write) as session:
            await session.initialize()
            started = result_value(await session.call_tool("run_start", {
                "version": "27",
                "gdb_wait": True,
                "extra_args": ["--version", "duo", "--txm-only", "--max-cpus", "4"],
            }))
            run_id = started["run_id"]
            try:
                registers = result_value(await session.call_tool("get_regs", {"run_id": run_id}))
                print(json.dumps({name: registers[name] for name in ("pc", "sp", "cpsr")}, indent=2))
                step = result_value(await session.call_tool("step", {"run_id": run_id}))
                print(json.dumps(step, indent=2))
            finally:
                await session.call_tool("run_kill", {"run_id": run_id})


if __name__ == "__main__":
    asyncio.run(main(sys.argv[1]))
