import argparse
import asyncio
import importlib.metadata
import json
import os


async def execute(offline):
    from openai import AsyncOpenAI
    import httpx2
    from semantic_kernel.contents import ChatHistory
    from semantic_kernel.connectors.ai.open_ai import OpenAIChatCompletion, OpenAIChatPromptExecutionSettings

    calls = []
    model = os.environ.get("QUICKROUTER_MODEL", "glm-5.3")

    def fixture(request):
        body = json.loads(request.content)
        calls.append({"path": request.url.path, "body": body})
        if request.url.path != "/v1/chat/completions" or body["model"] != model:
            raise AssertionError("Unexpected protocol or model")
        return httpx2.Response(200, json={"id": "chatcmpl-sk-fixture", "object": "chat.completion", "created": 1, "model": model, "choices": [{"index": 0, "message": {"role": "assistant", "content": "QUICKROUTER_OK"}, "finish_reason": "stop"}], "usage": {"prompt_tokens": 8, "completion_tokens": 4, "total_tokens": 12}})

    options = {"api_key": "offline-fixture" if offline else os.environ["QUICKROUTER_API_KEY"], "base_url": "https://api.quickrouter.ai/v1", "timeout": 30.0, "max_retries": 0}
    if offline:
        options["http_client"] = httpx2.AsyncClient(transport=httpx2.MockTransport(fixture))
    client = AsyncOpenAI(**options)
    try:
        service = OpenAIChatCompletion(ai_model_id=model, service_id="quickrouter", async_client=client)
        history = ChatHistory()
        history.add_user_message("仅回答 QUICKROUTER_OK")
        settings = OpenAIChatPromptExecutionSettings(service_id="quickrouter", max_tokens=64)
        result = await service.get_chat_message_contents(chat_history=history, settings=settings)
        text = str(result[0])
        if offline and (len(calls) != 1 or text != "QUICKROUTER_OK"):
            raise AssertionError("Offline fixture failed")
        return {"mode": "offline" if offline else "live", "status": "text-only-passed" if text.strip() == "QUICKROUTER_OK" else "needs-review", "sdk": importlib.metadata.version("semantic-kernel"), "model": model, "protocol": "/v1/chat/completions", "answer": text, "offlineRequests": calls, "billedUsd": None, "boundary": "One chat request; Kernel plugins, automatic function execution, vectors, streaming and actual billing unverified."}
    finally:
        await client.close()


def main():
    parser = argparse.ArgumentParser()
    parser.add_argument("--run", action="store_true")
    parser.add_argument("--offline", action="store_true")
    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": "semantic-kernel==1.45.0", "protocol": "/v1/chat/completions", "maxRetries": 0, "command": "--offline or --run"}, indent=2))
        return
    if args.run and not os.environ.get("QUICKROUTER_API_KEY"):
        parser.error("Set QUICKROUTER_API_KEY privately")
    try:
        print(json.dumps(asyncio.run(execute(args.offline)), ensure_ascii=False, indent=2))
    except Exception as error:
        print(json.dumps({"status": "unknown", "errorType": type(error).__name__, "boundary": "No retry; inspect logs before another live request."}))
        raise SystemExit(1)


if __name__ == "__main__":
    main()
