#!/usr/bin/env python3
"""DAS: perbaiki pelacak klik WhatsApp dengan menambahkan send_to ke properti GA4.
Pakai: python3 das_perbaiki_tracking.py [--id 8296] [--apply]"""
import base64, json, os, re, sys, time, urllib.request, urllib.error, importlib.util

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"}
GA4_ID = "G-TPR5KEQPC4"
BACKUP = f"{WS}/das_pemulihan/tracking2"
os.makedirs(BACKUP, exist_ok=True)


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"


def tambah_send_to(raw):
    """Tambahkan send_to ke properti GA4 di setiap pelacak klik_wa yang belum memilikinya."""
    n = [0]

    def ganti(mm):
        el = mm.group(0)
        if "klik_wa" not in el or "send_to" in el:
            return el
        n[0] += 1
        return el.replace("'transport_type':'beacon'", f"'send_to':'{GA4_ID}','transport_type':'beacon'")

    return re.sub(r"onclick=\"[^\"]*klik_wa[^\"]*\"", ganti, raw), n[0]


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

if "--id" in sys.argv:
    pid = int(sys.argv[sys.argv.index("--id") + 1])
    posts = [p for p in posts if p["id"] == pid]
    print(f"uji satu artikel: #{pid}")

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

print(f"rencana: {len(rencana)} artikel, {sum(r['n'] for r in rencana)} pelacak diperbaiki")
if "--apply" not in sys.argv:
    print("(dry run)")
    sys.exit(0)

ok = 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 ""
    ok += 1 if f"'send_to':'{GA4_ID}'" in raw2 else 0
    if i % 25 == 0 or i == len(rencana):
        print(f"   {i}/{len(rencana)} | berhasil {ok}")
print(f"selesai: {ok}/{len(rencana)}")
