#!/usr/bin/env python3
"""Uji: apakah event kustom via gtag benar-benar sampai ke GA4? (nama event unik + jeda panjang)"""
import asyncio, json, sys, time, urllib.request, websockets

PORT = int(sys.argv[2]) if len(sys.argv) > 2 else 9471
TARGET = sys.argv[1] if len(sys.argv) > 1 else "https://studiosoft.id/?cb=%d" % int(time.time())
NAMA = sys.argv[3] if len(sys.argv) > 3 else "hermes_uji_%d" % int(time.time())
hits = []


def buka_tab():
    req = urllib.request.Request(f"http://127.0.0.1:{PORT}/json/new?about:blank", method="PUT")
    for _ in range(15):
        try:
            return json.load(urllib.request.urlopen(req, timeout=3))
        except Exception:
            time.sleep(0.5)
    raise RuntimeError("tab gagal")


async def main():
    tab = buka_tab()
    async with websockets.connect(tab["webSocketDebuggerUrl"], max_size=2**24) as ws:
        pending, mid = {}, 0

        async def reader():
            async for raw in ws:
                m = json.loads(raw)
                if "id" in m and m["id"] in pending:
                    pending[m["id"]].set_result(m)
                elif m.get("method") == "Network.requestWillBeSent":
                    u = m["params"]["request"]["url"]
                    if "collect" in u or "analytics" in u or "google-analytics" in u:
                        hits.append(u)

        rtask = asyncio.create_task(reader())

        async def cmd(method, params=None):
            nonlocal mid
            mid += 1
            f = asyncio.get_event_loop().create_future()
            pending[mid] = f
            await ws.send(json.dumps({"id": mid, "method": method, "params": params or {}}))
            return await asyncio.wait_for(f, 30)

        async def ev(expr):
            r = await cmd("Runtime.evaluate", {"expression": expr, "returnByValue": True})
            return r.get("result", {}).get("result", {}).get("value")

        await cmd("Page.enable"); await cmd("Network.enable"); await cmd("Runtime.enable")
        await cmd("Page.navigate", {"url": TARGET})
        print("menunggu 25 detik supaya GA4 benar-benar siap...")
        await asyncio.sleep(25)
        print("kondisi:", await ev("JSON.stringify({marker:!!window.__ssTrackingPasang, gtag:typeof window.gtag, dl:(window.dataLayer||[]).length, gaClient:[].some.call(document.scripts,function(s){return /gtag\\/js|gtm\\.js/.test(s.src||'');})})"))
        hits.clear()
        print(f"mengirim event uji: {NAMA}")
        await ev(f"window.gtag('event','{NAMA}',{{sumber:'diagnosa-hermes'}}); 'ok'")
        await asyncio.sleep(12)
        print(f"beacon setelah kirim: {len(hits)}")
        for h in hits[:5]:
            en = h.split("en=")[1].split("&")[0] if "en=" in h else "(page_view)"
            jalur = "server-side" if "/g/s/collect" in h else "client-side"
            print(f"   {jalur:<12} event={en}")
        rtask.cancel()
    print("NAMA_EVENT_UJI=" + NAMA)


try:
    asyncio.run(main())
except Exception as e:
    print("ERR", type(e).__name__, str(e)[:200])
