"""WebSocket integration tests for the terminal client."""

from __future__ import annotations

import asyncio
import json

import pytest
import websockets

from clients.terminal.config import Settings
from clients.terminal.render import Renderer
from clients.terminal.ws_client import NaviWebSocketClient


async def fake_navi_server(websocket: websockets.ServerConnection) -> None:
    """Fake Navi server: echo one message back as stream events."""
    raw = await websocket.recv()
    msg = json.loads(raw)
    assert msg["type"] == "message"

    events = [
        {"type": "session_sync", "session_id": "test-session", "profile_id": "navi_code"},
        {"type": "stream_start"},
        {"type": "stream_delta", "delta": "Echo: "},
        {"type": "stream_delta", "delta": msg["content"]},
        {"type": "stream_end", "content": f"Echo: {msg['content']}"},
    ]
    for ev in events:
        await websocket.send(json.dumps(ev))


@pytest.mark.anyio
async def test_run_one_shot_receives_and_renders_events() -> None:
    stop_event = asyncio.Event()

    async def serve() -> None:
        async with websockets.serve(fake_navi_server, "127.0.0.1", 0) as server:
            port = server.sockets[0].getsockname()[1]
            settings = Settings(base_url=f"http://127.0.0.1:{port}")
            renderer = Renderer()
            client = NaviWebSocketClient("test-session", renderer=renderer)
            client.url = settings.websocket_url("test-session")

            await client.run_one_shot("hello")
            stop_event.set()

    await asyncio.wait_for(serve(), timeout=10.0)
    assert stop_event.is_set()
