"""
Test all Voice Agent backend APIs. Run with Django server up: python manage.py runserver

Usage (from backend folder):
  python test_apis.py

Or: python test_apis.py --base http://localhost:8000
"""
import argparse
import sys
import uuid

try:
    import httpx
except ImportError:
    print("Install httpx: python -m pip install httpx")
    sys.exit(1)

BASE = "http://localhost:8000"


def get(path: str, params: dict | None = None) -> httpx.Response:
    return httpx.get(f"{BASE}{path}", params=params or {}, timeout=10.0)


def post(path: str, json: dict) -> httpx.Response:
    return httpx.post(f"{BASE}{path}", json=json, timeout=10.0)


def ok(r: httpx.Response, name: str) -> bool:
    if r.status_code in (200, 201):
        print(f"  OK {name} -> {r.status_code}")
        return True
    print(f"  FAIL {name} -> {r.status_code} {r.text[:200]}")
    return False


def test_root_and_api():
    print("\n--- Root & API index ---")
    r = get("/")
    ok(r, "GET /")
    r = get("/api/")
    ok(r, "GET /api/")


def test_agents():
    print("\n--- Agents ---")
    r = get("/api/agents/")
    if ok(r, "GET /api/agents/"):
        data = r.json()
        print(f"    agents: {data.get('agents', [])}")
    r = get("/api/agents/default/config/")
    if r.status_code == 200:
        print("  OK GET /api/agents/default/config/")
        print(f"    name: {r.json().get('name')}, stt: {r.json().get('stt_provider')}, tts: {r.json().get('tts_provider')}")
    else:
        print(f"  (GET /api/agents/default/config/ -> {r.status_code}, agent may not exist in DB)")


def test_conversation_flow():
    print("\n--- Conversation flow ---")

    # 1) Start session
    r = post("/api/sessions/start/", {"room_name": "test-room", "identity": "test-user"})
    if not ok(r, "POST /api/sessions/start/"):
        return
    data = r.json()
    token = data.get("token")
    room_name = data.get("room_name")
    conversation_id = data.get("conversation_id")
    print(f"    conversation_id: {conversation_id}, room: {room_name}, token: {token[:20]}...")

    # 2) Get token (optional, same conversation)
    r = get("/api/token/", {"room": room_name, "identity": "test-user", "conversation_id": conversation_id})
    ok(r, "GET /api/token/?room=&identity=&conversation_id=...")

    # 3) POST user turn
    r = post(
        f"/api/conversations/{conversation_id}/turns/",
        {"transcript": "Hello, what can you do?", "detected_language": "en", "stt_provider": "deepgram"},
    )
    if not ok(r, "POST /api/conversations/<id>/turns/"):
        return
    turn_data = r.json()
    turn_id = turn_data.get("turn_id")
    print(f"    turn_id: {turn_id}")

    # 4) POST agent response for that turn
    r = post(
        f"/api/conversations/{conversation_id}/turns/{turn_id}/response/",
        {
            "response_text": "I can help you with questions and have a voice conversation.",
            "llm_provider": "sarvam",
            "tts_provider": "elevenlabs",
            "language_used": "en",
        },
    )
    ok(r, "POST /api/conversations/<id>/turns/<turn_id>/response/")

    # 5) GET turns list
    r = get(f"/api/conversations/{conversation_id}/turns/")
    ok(r, "GET /api/conversations/<id>/turns/")
    if r.status_code == 200:
        turns = r.json()
        print(f"    turns count: {len(turns)}")

    # 6) GET transcript
    r = get(f"/api/conversations/{conversation_id}/transcript/")
    if ok(r, "GET /api/conversations/<id>/transcript/"):
        transcript = r.json()
        for entry in transcript:
            role = entry.get("role")
            text = (entry.get("text") or "")[:60]
            print(f"    [{role}] {text}...")


def main():
    global BASE
    parser = argparse.ArgumentParser(description="Test Voice Agent backend APIs")
    parser.add_argument("--base", default=BASE, help=f"Base URL (default: {BASE})")
    args = parser.parse_args()
    BASE = args.base.rstrip("/")

    print(f"Testing APIs at {BASE}")
    test_root_and_api()
    test_agents()
    test_conversation_flow()
    print("\nDone.")


if __name__ == "__main__":
    main()
