import asyncio
import json
import websockets
import pytest
from pydantic import BaseModel

async def test_websocket_sync():
    uri = "ws://localhost:8000/ws"
    async with websockets.connect(uri) as websocket:
        # 1. Send hello
        hello = {
            "type": "hello",
            "seqs": {}
        }
        await websocket.send(json.dumps(hello))
        
        # 2. Receive snapshots
        # Expecting TraderState and StrategyState
        responses = []
        for _ in range(2):
            resp = await websocket.recv()
            responses.append(json.loads(resp))
            
        assert any(r["store"] == "TraderState" for r in responses)
        assert any(r["store"] == "StrategyState" for r in responses)
        
        # 3. Send a patch for TraderState
        trader_resp = next(r for r in responses if r["store"] == "TraderState")
        current_seq = trader_resp["seq"]
        
        patch_msg = {
            "type": "patch",
            "store": "TraderState",
            "seq": current_seq,
            "patch": [{"op": "replace", "path": "/status", "value": "busy"}]
        }
        await websocket.send(json.dumps(patch_msg))
        
        # 4. Receive confirmation patch
        confirm_resp = await websocket.recv()
        confirm_json = json.loads(confirm_resp)
        assert confirm_json["type"] == "patch"
        assert confirm_json["store"] == "TraderState"
        assert confirm_json["seq"] == current_seq + 1
        assert confirm_json["patch"][0]["value"] == "busy"

if __name__ == "__main__":
    # This script requires the server to be running:
    # PYTHONPATH=backend/src python3 backend/src/main.py
    try:
        asyncio.run(test_websocket_sync())
        print("Test passed!")
    except Exception as e:
        print(f"Test failed: {e}")
