import argparse
import asyncio
import importlib.metadata
import json
import os
from pathlib import Path
import tempfile


async def execute(offline):
    from claude_agent_sdk import ClaudeAgentOptions, ResultMessage, query

    key = "offline-fixture" if offline else os.environ["QUICKROUTER_API_KEY"]
    model = os.environ.get("QUICKROUTER_MODEL", "claude-sonnet-5")
    with tempfile.TemporaryDirectory(prefix="quickrouter-claude-agent-") as directory:
        options = ClaudeAgentOptions(model=model, tools=[], allowed_tools=[], disallowed_tools=["Bash", "Read", "Write", "Edit", "WebFetch", "WebSearch"], setting_sources=[], cwd=directory, max_turns=1, env={"ANTHROPIC_API_KEY": key, "ANTHROPIC_AUTH_TOKEN": "", "ANTHROPIC_BASE_URL": "https://api.quickrouter.ai", "API_TIMEOUT_MS": "45000", "CLAUDE_CODE_MAX_RETRIES": "0", "CLAUDE_CODE_RETRY_WATCHDOG": "0", "DISABLE_TELEMETRY": "1"})
        if offline:
            return {"mode": "offline-options-only", "sdk": importlib.metadata.version("claude-agent-sdk"), "baseUrl": options.env["ANTHROPIC_BASE_URL"], "model": options.model, "tools": options.tools, "maxTurns": options.max_turns, "settingSources": options.setting_sources, "retries": options.env["CLAUDE_CODE_MAX_RETRIES"], "boundary": "Options constructed only; query(), CLI inference, streaming and real gateway authentication unverified."}
        final = None
        async for event in query(prompt="只回答 QUICKROUTER_OK，不使用工具。", options=options):
            if isinstance(event, ResultMessage):
                final = {"status": "failed" if event.is_error else "needs-review", "result": event.result, "numTurns": event.num_turns, "usage": event.usage, "sdkReportedCostUsd": event.total_cost_usd, "billedUsd": None}
        if final is None:
            raise RuntimeError("No result event")
        final.update({"mode": "live", "sdk": importlib.metadata.version("claude-agent-sdk"), "model": model, "baseUrl": "https://api.quickrouter.ai", "boundary": "SDK query using its CLI runtime; one text-only turn. Tool loop, sessions, other models and actual billing require separate checks."})
        if final["status"] != "failed" and str(final["result"]).strip() == "QUICKROUTER_OK":
            final["status"] = "text-only-passed"
        return final


def main():
    parser = argparse.ArgumentParser()
    parser.add_argument("--run", action="store_true")
    parser.add_argument("--offline", action="store_true")
    parser.add_argument("--output", default="claude-agent-record.json")
    args = parser.parse_args()
    if args.run and args.offline:
        parser.error("Choose --run or --offline")
    if not args.run and not args.offline:
        print(json.dumps({"mode": "preview", "sdk": "claude-agent-sdk==0.2.164", "task": "One text-only SDK query, tools disabled, isolated temporary cwd", "run": "--run --output UNIQUE_RECORD.json", "offline": "--offline --output UNIQUE_OPTIONS.json", "boundary": "Base URL is root origin, not /v1. Native Messages, streaming and SDK-specific parameters must be accepted by the gateway."}, ensure_ascii=False, indent=2))
        return
    if args.run and not os.environ.get("QUICKROUTER_API_KEY"):
        parser.error("Set QUICKROUTER_API_KEY privately")
    path = Path(args.output)
    path.parent.mkdir(parents=True, exist_ok=True)
    try:
        with path.open("x") as handle:
            json.dump({"status": "submitting", "billedUsd": None}, handle)
    except FileExistsError:
        parser.error("Record exists; inspect before another live run")
    try:
        result = asyncio.run(execute(args.offline))
    except Exception as error:
        result = {"status": "unknown", "errorType": type(error).__name__, "billedUsd": None, "boundary": "No retry. Error text omitted; inspect account logs."}
    temporary = path.with_suffix(path.suffix + ".tmp")
    temporary.write_text(json.dumps(result, ensure_ascii=False, indent=2) + "\n")
    temporary.replace(path)
    print(json.dumps({"status": result.get("status", "options-constructed"), "record": str(path)}))
    if result.get("status") in {"unknown", "failed", "needs-review"}:
        raise SystemExit(1)


if __name__ == "__main__":
    main()
