"""Phase A: what each tool hands the model for the same real page.
For each page: agent-browser (open + snapshot, and snapshot -i), Playwright MCP (browser_navigate, browser_snapshot),
Chrome DevTools MCP (navigate_page, take_snapshot). Saves every raw output, its size and the time taken."""
import asyncio, json, os, subprocess, time, pathlib
from mcp import ClientSession
from mcp.client.stdio import stdio_client, StdioServerParameters
PAGES = [l.strip() for l in open("pages.txt") if l.strip()]
OUT = pathlib.Path("phase_a"); OUT.mkdir(exist_ok=True)
AB = ["npx", "agent-browser", "--session", "phasea"]

def text_of(res):
    return "\n".join(c.text for c in res.content if getattr(c, "type", "") == "text")

def ab(*cmd):
    t = time.time(); p = subprocess.run(AB + list(cmd), capture_output=True, text=True, timeout=120)
    return p.stdout + (p.stderr if p.returncode else ""), round(time.time() - t, 2)

async def mcp_run(name, params, nav_tool, nav_args, snap_tool, snap_args=None):
    rows = []
    async with stdio_client(params) as (r, w):
        async with ClientSession(r, w) as s:
            await s.initialize()
            for i, url in enumerate(PAGES):
                row = {"tool": name, "url": url}
                try:
                    t = time.time(); nav = text_of(await s.call_tool(nav_tool, nav_args(url))); row["nav_s"] = round(time.time() - t, 2)
                    t = time.time(); snap = text_of(await s.call_tool(snap_tool, snap_args or {})); row["snap_s"] = round(time.time() - t, 2)
                    row["nav_chars"], row["snap_chars"] = len(nav), len(snap)
                    (OUT / f"{name}_{i:02d}_nav.txt").write_text(nav); (OUT / f"{name}_{i:02d}_snap.txt").write_text(snap)
                except Exception as e:
                    row["error"] = f"{type(e).__name__}: {e}"[:200]
                rows.append(row); print(name, i, row.get("snap_chars"), row.get("error", ""), flush=True)
    return rows

async def main():
    rows = []
    for i, url in enumerate(PAGES):
        row = {"tool": "agent-browser", "url": url}
        nav, row["nav_s"] = ab("open", url)
        snap, row["snap_s"] = ab("snapshot")
        snapi, row["snapi_s"] = ab("snapshot", "-i")
        row["nav_chars"], row["snap_chars"], row["snapi_chars"] = len(nav), len(snap), len(snapi)
        (OUT / f"agent-browser_{i:02d}_nav.txt").write_text(nav); (OUT / f"agent-browser_{i:02d}_snap.txt").write_text(snap); (OUT / f"agent-browser_{i:02d}_snapi.txt").write_text(snapi)
        rows.append(row); print("agent-browser", i, row["snap_chars"], row["snapi_chars"], flush=True)
    ab("close")
    rows += await mcp_run("playwright-mcp", StdioServerParameters(command="npx", args=["@playwright/mcp", "--headless", "--isolated"]),
                          "browser_navigate", lambda u: {"url": u}, "browser_snapshot")
    rows += await mcp_run("devtools-mcp", StdioServerParameters(command="npx", args=["chrome-devtools-mcp", "--headless", "--isolated", "--no-usage-statistics", "--no-performance-crux"]),
                          "navigate_page", lambda u: {"type": "url", "url": u}, "take_snapshot")
    json.dump(rows, open("phase_a.json", "w"), indent=1)
if __name__ == '__main__':
    asyncio.run(main())
