#!/usr/bin/env python3
"""Diagnosa mendalam: apakah handler snippet benar-benar memanggil gtag, dan apa yang memblokirnya."""
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/"
hits, gtag_calls = [], []


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 "google-analytics" in u or "analytics.google" 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 evaljs(expr):
            r = await cmd("Runtime.evaluate", {"expression": expr, "returnByValue": True, "awaitPromise": 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})
        await asyncio.sleep(9)

        # pasang perekam panggilan gtag
        await evaljs("""
          window.__log = [];
          if (!window.__gtagAsli) {
            window.__gtagAsli = window.gtag;
            window.gtag = function () {
              try { window.__log.push(Array.from(arguments).map(function(a){
                return (typeof a === 'object') ? JSON.stringify(a) : String(a); }).join(' | ')); } catch (e) {}
              return window.__gtagAsli.apply(this, arguments);
            };
          }
          'ok'
        """)

        print("status awal:", await evaljs("JSON.stringify({marker: !!window.__ssTrackingPasang, consent: (window.dataLayer||[]).filter(function(e){return String(e[0]).toLowerCase().indexOf('consent')>-1;}), dlLen:(window.dataLayer||[]).length})"))

        # 1) uji panggil gtag langsung
        await evaljs("window.gtag('event','uji_manual_hermes',{sumber:'diagnosa'}); 'dikirim'")
        await asyncio.sleep(4)
        print("beacon setelah gtag manual:", len(hits))

        # 2) klik tombol WhatsApp
        await evaljs("""
          (function(){ var a=document.querySelector('a[href*="wa.me"],a[href*="whatsapp"]');
            if(a){ a.dispatchEvent(new MouseEvent('click',{bubbles:true,cancelable:true,view:window})); return 'klik WA'; }
            return 'tidak ada link WA'; })()
        """)
        await asyncio.sleep(3)

        # 3) klik elemen Chaty (kalau ada)
        await evaljs("""
          (function(){ var c=document.querySelector('[class*="chaty"],[id*="chaty"]');
            if(c){ c.dispatchEvent(new MouseEvent('click',{bubbles:true,cancelable:true,view:window})); return 'klik chaty'; }
            return 'tidak ada elemen chaty'; })()
        """)
        await asyncio.sleep(4)

        print("\npanggilan gtag yang tercatat:")
        for x in (await evaljs("JSON.stringify(window.__log)") or "[]") and json.loads(await evaljs("JSON.stringify(window.__log)") or "[]"):
            print("   ", x[:110])

        print(f"\nbeacon total: {len(hits)}")
        for h in hits:
            en = h.split("en=")[1].split("&")[0] if "en=" in h else "(page_view)"
            tid = h.split("tid=")[1].split("&")[0] if "tid=" in h else "-"
            jalur = "server-side" if "/g/s/collect" in h else "client-side"
            print(f"   {jalur:<12} tid={tid:<16} event={en}")
        rtask.cancel()


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