#!/bin/bash
INST="friend-bb2f6f43"
TOKEN=$(docker exec postgres_db psql -U knowledge -d yunwoai -t -A -c "SELECT friend_token FROM user_friend_agents WHERE user_id='100';")

echo "=== 1. 更新绑定表为 running ==="
docker exec postgres_db psql -U knowledge -d yunwoai -c "UPDATE user_friend_agents SET state='running', last_error='' WHERE user_id='100';" 2>&1 | tail -1

echo "=== 2. WS 端到端测试（chains.list + chains.send + brain.stream）==="
python3 <<'PYEOF'
import json, time, threading, websocket

ws_url = "ws://127.0.0.1:8081/api/user/friend-agent/ws"
token = "TOKEN_PLACEHOLDER"
ws_url_full = ws_url + "?token=" + token

events = []
ws_ready = threading.Event()

def on_message(ws, msg):
    d = json.loads(msg)
    if d.get("type") == "event":
        events.append(d)
    elif d.get("type") == "res":
        print(f"RES [{d.get('request_id')}] status={d.get('status')}")
        result = d.get('result')
        if result:
            print(f"  result: {json.dumps(result)[:200]}")
        err = d.get('error')
        if err:
            print(f"  error: {err}")

def on_open(ws):
    ws_ready.set()
    # 1. chains.list
    ws.send(json.dumps({"type":"req","request_id":"e2e-list","method":"chains.list","payload":{}}))
    time.sleep(2)
    # 2. chains.send (inject message)
    ws.send(json.dumps({"type":"req","request_id":"e2e-send","method":"chains.send","payload":{"message":"你好，请简单介绍一下你自己"}}))
    # wait for brain.stream events
    time.sleep(45)
    ws.close()

def on_error(ws, err):
    print(f"WS_ERROR: {err}")

def on_close(ws, code, msg):
    print(f"WS_CLOSED code={code}")

ws = websocket.WebSocketApp(ws_url_full, on_message=on_message, on_open=on_open, on_error=on_error, on_close=on_close)
ws.run_forever()

print(f"\n=== 收到 {len(events)} 个 event ===")
for e in events[:10]:
    print(f"  topic={e.get('topic')} data={json.dumps(e.get('data',{}))[:150]}")
PYEOF

# Replace token and run
python3 -c "
import json, time, threading, websocket, sys

token = '$TOKEN'
ws_url = 'ws://127.0.0.1:8081/api/user/friend-agent/ws?token=' + token
events = []

def on_message(ws, msg):
    d = json.loads(msg)
    if d.get('type') == 'event':
        events.append(d)
        topic = d.get('topic','')
        data = json.dumps(d.get('data',{}))[:120]
        print(f'EVENT topic={topic} data={data}')
    elif d.get('type') == 'res':
        rid = d.get('request_id','')
        st = d.get('status','')
        result = d.get('result')
        err = d.get('error')
        if result:
            print(f'RES [{rid}] {st} result={json.dumps(result)[:200]}')
        elif err:
            print(f'RES [{rid}] {st} error={err}')
        else:
            print(f'RES [{rid}] {st}')

def on_open(ws):
    print('WS_OPEN')
    ws.send(json.dumps({'type':'req','request_id':'e2e-list','method':'chains.list','payload':{}}))
    time.sleep(3)
    ws.send(json.dumps({'type':'req','request_id':'e2e-send','method':'chains.send','payload':{'message':'你好，请简单介绍一下你自己'}}))
    time.sleep(50)
    ws.close()

def on_error(ws, err): print(f'WS_ERROR: {err}')
def on_close(ws, code, msg): print(f'WS_CLOSED code={code}')

ws = websocket.WebSocketApp(ws_url, on_message=on_message, on_open=on_open, on_error=on_error, on_close=on_close)
ws.run_forever()
print(f'Total events: {len(events)}')
"
