#!/usr/bin/env python3
"""Cek dari dalam browser: container yang diunduh memuat tag kita atau tidak."""
import asyncio, json, sys, time, urllib.request, websockets

PORT = int(sys.argv[2]) if len(sys.argv) > 2 else 9511
TARGET = sys.argv[1] if len(sys.argv) > 1 else "https://studiosoft.id/"


def 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():
    t = tab()
    async with websockets.connect(t["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)

        rt = 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, 40)

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

        await cmd("Page.enable"); await cmd("Runtime.enable")
        await cmd("Page.navigate", {"url": TARGET})
        await asyncio.sleep(8)

        cek = await ev("""(async function(){
            var out = {};
            for (var id of ['GTM-WQX6PGNR','GTM-PZBR35TB']) {
              try {
                var r = await fetch('https://www.googletagmanager.com/gtm.js?id='+id+'&cb='+Date.now());
                var t = await r.text();
                out[id] = {byte: t.length, adaTagKita: t.indexOf('manual_event_CONTACT')>-1, adaQualify: t.indexOf('qualify_lead')>-1};
              } catch(e) { out[id] = 'ERR '+e.message; }
            }
            return JSON.stringify(out);
        })()""")
        print("container yang benar-benar diunduh browser:")
        print(" ", cek)
        rt.cancel()


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