import os
os.environ["FREEEXILE_DEV_MODE"] = "1"

import asyncio
import json
import sqlite3
import time
from pathlib import Path

# Add server to path
import sys
base_dir = Path(__file__).resolve().parent.parent
if str(base_dir) not in sys.path:
    sys.path.insert(0, str(base_dir))

import websockets
from server.gateway.ws_gateway_bridge import get_bridge_instance

async def run_client_phase_1():
    async with websockets.connect("ws://127.0.0.1:8080") as ws:
        # Drain welcome message
        await ws.recv()
        
        # Register accounts
        await ws.send(json.dumps({"type": "e2e_register_account", "account_id": "seller_01"}))
        print("REG1:", await ws.recv())
        await ws.send(json.dumps({"type": "e2e_register_account", "account_id": "buyer_02"}))
        print("REG2:", await ws.recv())
        
        # Add item for seller
        await ws.send(json.dumps({"type": "e2e_add_item", "account_id": "seller_01"}))
        res = json.loads(await ws.recv())
        print("ADD ITEM RES:", res)
        item_uuid = res.get("item_uuid")
        
        # Add currency for buyer
        await ws.send(json.dumps({"type": "e2e_add_currency", "account_id": "buyer_02", "currency": "ThienMenh", "amount": 100}))
        await ws.recv()
        
        # Execute buyout
        await ws.send(json.dumps({
            "type": "e2e_buyout", 
            "buyer": "buyer_02", 
            "seller": "seller_01", 
            "item_uuid": item_uuid,
            "price": 20
        }))
        res = json.loads(await ws.recv())
        assert res["success"] is True, f"Buyout failed: {res}"
        
        # Agent Orb Delegation
        await ws.send(json.dumps({"type": "e2e_grant_orb", "player_id": 999}))
        await ws.recv()
        
        await ws.send(json.dumps({"type": "e2e_activate_agent", "player_id": 999}))
        res = json.loads(await ws.recv())
        assert res["success"] is True, "Agent activation failed"
        print("[Client Phase 1] Operations completed and saved to DB.")
        return item_uuid

def verify_db_state(item_uuid):
    # Verify trade ledger
    trade_db_path = base_dir / "data" / "trade_ledger.db"
    conn = sqlite3.connect(str(trade_db_path))
    cur = conn.cursor()
    
    cur.execute("SELECT owner_account_id FROM items WHERE item_uuid = ?", (item_uuid,))
    owner = cur.fetchone()[0]
    assert owner == "buyer_02", f"Expected item to be owned by buyer_02, got {owner}"
    print("[Verify Phase 2] Trade 2PC DB persistent verified! Item owner updated correctly.")
    
    # Verify agent delegations
    agent_db_path = base_dir / "data" / "agent_delegations.db"
    conn2 = sqlite3.connect(str(agent_db_path))
    cur2 = conn2.cursor()
    cur2.execute("SELECT * FROM active_sessions WHERE player_id = 999")
    session = cur2.fetchone()
    assert session is not None, "Agent session not persisted"
    print("[Verify Phase 2] Agent Delegation DB persistent verified! Session found.")

async def main():
    # Start server
    print("[Server] Starting WsGatewayBridge...")
    bridge = get_bridge_instance()
    await bridge.start_server()
    
    # Run client to populate data
    item_uuid = await run_client_phase_1()
    
    # Stop server
    print("[Server] Stopping WsGatewayBridge...")
    await bridge.stop_server()
    
    # Verify persistence
    verify_db_state(item_uuid)
    
    print("\nE2E Acceptance Test Passed! System runs flawlessly end-to-end and data persists correctly.")

if __name__ == "__main__":
    asyncio.run(main())
