#!/usr/bin/env python3
"""DAS: tanam pelacak klik WhatsApp pada SEMUA tautan wa.me di isi artikel.
Tanpa tema, tanpa plugin: memakai Google Tag yang sudah terpasang (Site Kit, GT-NGKV39RQ).
Event GA4: 'klik_wa' dengan parameter link_url, lokasi halaman, dan jenis tombol.
Pakai --apply untuk menulis.
"""
import base64, json, os, re, sys, time, urllib.request, urllib.error, importlib.util
from collections import Counter

WS = "/home/mantapman/.hermes/profiles/atun/workspace"
spec = importlib.util.spec_from_file_location("cfg_das", f"{WS}/cfg_das.py")
m = importlib.util.module_from_spec(spec); spec.loader.exec_module(m)
CFG = m.CFG
DOM, AUTH = CFG["domain"], base64.b64encode(f'{CFG["user"]}:{CFG["pass"]}'.encode()).decode()
UA = {"User-Agent": "Mozilla/5.0"}
BACKUP = f"{WS}/das_pemulihan/tracking"
os.makedirs(BACKUP, exist_ok=True)

# pelacak: aman kalau gtag tidak ada (tautan tetap jalan seperti biasa)
def pelacak(jenis):
    return ("if(window.gtag){gtag('event','klik_wa',{"
            "'link_url':this.href,"
            "'page_location':window.location.href,"
            f"'jenis_tombol':'{jenis}',"
            "'transport_type':'beacon'});}")


def rest(p, method="GET", data=None):
    h = {"Authorization": f"Basic {AUTH}", **UA}
    body = None
    if data is not None:
        body = json.dumps(data).encode(); h["Content-Type"] = "application/json"
    r = urllib.request.Request(f"https://{DOM}{p}", data=body, headers=h, method=method)
    for _ in range(3):
        try:
            with urllib.request.urlopen(r, timeout=200) as x:
                return x.status, json.loads(x.read())
        except urllib.error.HTTPError as e:
            return e.code, e.read().decode()[:200]
        except Exception:
            time.sleep(5)
    return 0, "gagal"


posts, page = [], 1
while True:
    st, d = rest(f"/wp-json/wp/v2/posts?per_page=100&page={page}&status=publish&context=edit&_fields=id,slug,content")
    if not isinstance(d, list):
        break
    posts += d
    if len(d) < 100:
        break
    page += 1
print(f"artikel: {len(posts)}")


def tambah_pelacak(raw):
    n = [0]

    def ganti(mm):
        el = mm.group(0)
        if "klik_wa" in el:
            return el
        if not re.search(r'https?://(?:wa\.me|api\.whatsapp\.com|web\.whatsapp\.com)', el, re.I):
            return el
        jenis = "tombol_promo" if re.search(r"AMBIL PROMO", el, re.I) else \
                ("tombol_konsultasi" if re.search(r"KONSULTASI|HUBUNGI|KONTAK", el, re.I) else "tautan_teks")
        n[0] += 1
        return el.replace("<a ", f'<a onclick="{pelacak(jenis)}" ', 1)

    baru = re.sub(r"<a [^>]*>.*?</a>", ganti, raw, flags=re.S | re.I)
    return baru, n[0]


rencana = []
for p in posts:
    raw = p.get("content", {}).get("raw", "") or ""
    baru, n = tambah_pelacak(raw)
    if n:
        rencana.append({"id": p["id"], "slug": p["slug"], "raw": raw, "baru": baru, "n": n})

total = sum(r["n"] for r in rencana)
print(f"rencana: {len(rencana)} artikel, {total} tautan WhatsApp akan dilacak")

if "--apply" not in sys.argv:
    print("(dry run — pakai --apply)")
    sys.exit(0)

ok = gagal = 0
for i, r in enumerate(rencana, 1):
    open(f"{BACKUP}/post_{r['id']}.txt", "w").write(r["raw"])
    rest(f"/wp-json/wp/v2/posts/{r['id']}", "POST", {"content": r["baru"]})
    _, cek = rest(f"/wp-json/wp/v2/posts/{r['id']}?context=edit&_fields=content")
    raw2 = cek.get("content", {}).get("raw", "") if isinstance(cek, dict) else ""
    if "klik_wa" in raw2 and raw2.count("klik_wa") >= r["n"]:
        ok += 1
    else:
        gagal += 1
        print(f"   ⚠️ #{r['id']} pelacak tidak terpasang penuh")
    if i % 25 == 0 or i == len(rencana):
        print(f"   {i}/{len(rencana)} | beres {ok} | gagal {gagal}")

print("\n=== verifikasi ===")
p2, page = [], 1
while True:
    st, d = rest(f"/wp-json/wp/v2/posts?per_page=100&page={page}&status=publish&context=edit&_fields=id,content")
    if not isinstance(d, list):
        break
    p2 += d
    if len(d) < 100:
        break
    page += 1
punya = sum(1 for x in p2 if "klik_wa" in (x.get("content", {}).get("raw", "") or ""))
jml = sum((x.get("content", {}).get("raw", "") or "").count("klik_wa") for x in p2)
print(f"   artikel berpelacak: {punya}/{len(p2)} | jumlah pelacak: {jml}")
