import json, time, hmac, hashlib, urllib.request, ssl
try:
    import websocket
except ImportError:
    import subprocess, sys
    subprocess.check_call([sys.executable, "-m", "pip", "install", "-q", "websocket-client"])
    import websocket

# login
body=json.dumps({"username":"cxbsoft","password":"cf5584aca177a811ffda8f4789e2e143"}).encode()
req=urllib.request.Request("http://127.0.0.1:8081/api/login", data=body, headers={"Content-Type":"application/json"})
with urllib.request.urlopen(req, timeout=15) as r:
    login=json.loads(r.read().decode())
token=login.get("data",{}).get("token") or login.get("token") or login.get("data",{}).get("access_token")
print("LOGIN_KEYS", list(login.keys()), "data_keys", list((login.get("data") or {}).keys())[:10], "token_len", len(token or ""))
if not token:
    print("LOGIN_FAIL", json.dumps(login)[:400]); raise SystemExit(1)

# get ws url / friend token from status
req=urllib.request.Request("http://127.0.0.1:8081/api/user/friend-agent/status", headers={"Authorization":"Bearer "+token, "Content-Type":"application/json"})
with urllib.request.urlopen(req, timeout=15) as r:
    st=json.loads(r.read().decode())
print("STATUS", json.dumps(st)[:500])
data=st.get("data") or st
ws_url = data.get("ws_url") or "ws://127.0.0.1:8081/api/user/friend-agent/ws"
# many deployments use same origin + friend token cookie/header
ft = data.get("friend_token") or data.get("token") or token
print("WS", ws_url, "ft_len", len(ft or ""))

got=[]
def on_msg(ws, msg):
    try:
        d=json.loads(msg)
    except Exception:
        print("RAW", msg[:200]); return
    kind=d.get("kind") or d.get("type")
    rid=d.get("request_id")
    print("EV", kind, "rid", rid, "status", d.get("status"), "keys", list(d.keys())[:12])
    if rid=="fd1" or d.get("status") in ("ok","error"):
        got.append(d)
        if d.get("status"):
            res=d.get("result") or {}
            err=d.get("error")
            size=(res.get("size") if isinstance(res,dict) else None)
            b64=res.get("base64") if isinstance(res,dict) else None
            print("DOWNLOAD", "status", d.get("status"), "size", size, "b64_len", len(b64 or ""), "err", err)
            ws.close()

def on_open(ws):
    print("OPEN")
    ws.send(json.dumps({
        "kind":"req","type":"req","request_id":"fd1","id":"fd1",
        "method":"file.download",
        "params":{"file_path":"/tmp/wastewater_flow/acid_wash-06.png"}
    }))

ws=websocket.WebSocketApp(ws_url, header=["Authorization: Bearer "+ft], on_open=on_open, on_message=on_msg, on_error=lambda w,e: print("ERR", e), on_close=lambda *a: print("CLOSE", a[1:]))
ws.run_forever(ping_interval=10, ping_timeout=5)
print("GOT", len(got))
if got:
    d=got[-1]
    res=d.get("result") or {}
    print("FINAL", d.get("status"), "size", res.get("size") if isinstance(res,dict) else None, "err", d.get("error"))
