"""Trigger a CBOMkit scan over its websocket API and save every message plus the CBOM."""
import asyncio, json, sys, time, uuid
from pathlib import Path
import websockets

OUT = Path(sys.argv[1])
REQUEST = {"scanUrl": "file:///repos/cryptography", "branch": "cbomkit-pin", "subfolder": None, "credentials": None}


async def main():
    OUT.mkdir(parents=True, exist_ok=True)
    url = f"ws://127.0.0.1:8081/v1/scan/{uuid.uuid4().hex}"
    log = []
    t0 = time.time()
    async with websockets.connect(url, max_size=None, ping_interval=None, open_timeout=30) as ws:
        await asyncio.sleep(1.5)
        await ws.send(json.dumps(REQUEST))
        while True:
            try:
                raw = await asyncio.wait_for(ws.recv(), timeout=240)
            except asyncio.TimeoutError:
                print("timeout waiting for messages"); break
            msg = json.loads(raw)
            log.append({"t": round(time.time() - t0, 1), **({k: v for k, v in msg.items() if k != "message"} | {"message": msg.get("message") if msg.get("type") != "CBOM" else "<cbom>"})})
            kind = msg.get("type")
            text = msg.get("message")
            if kind == "CBOM":
                (OUT / "cbomkit-cbom.json").write_text(json.dumps(json.loads(text), indent=2))
                print(f"[{log[-1]['t']}s] CBOM received")
                break
            print(f"[{log[-1]['t']}s] {kind}: {str(text)[:160]}")
            if kind == "ERROR":
                break
    (OUT / "cbomkit-progress.json").write_text(json.dumps(log, indent=2))
    print(f"done in {round(time.time() - t0, 1)}s")

asyncio.run(main())
