#!/usr/bin/env python3
"""TSC: seragamkan SEMUA tautan WhatsApp di artikel -> satu tautan resmi.
Target (nomor dibersihkan dari spasi):
https://api.whatsapp.com/send/?phone=6285194936363&text=Saya+ingin+konsultasi+masalah+kulit+di+Klinik+DNI+Krian&type=phone_number&app_absent=0
Salinan tiap artikel disimpan dulu. Jalankan --apply untuk menulis."""
import base64, html, 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_tsc", f"{WS}/cfg_tsc.py")
m = importlib.util.module_from_spec(spec); spec.loader.exec_module(m)
DOM, AUTH = m.CFG["domain"], base64.b64encode(f'{m.CFG["user"]}:{m.CFG["pass"]}'.encode()).decode()
UA = {"User-Agent": "Mozilla/5.0"}
BACKUP = f"{WS}/tsc_pemulihan/salinan_wa"
os.makedirs(BACKUP, exist_ok=True)

TARGET = ("https://api.whatsapp.com/send/?phone=6285194936363"
          "&text=Saya+ingin+konsultasi+masalah+kulit+di+Klinik+DNI+Krian"
          "&type=phone_number&app_absent=0")
TARGET_HTML = TARGET.replace("&", "&amp;")


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=180) as x:
                return json.loads(x.read())
        except urllib.error.HTTPError as e:
            return {"__err": e.code}
        except Exception:
            time.sleep(4)
    return {}


posts, page = [], 1
while True:
    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

POLA = re.compile(r'href="([^"]*(?:api\.whatsapp\.com|wa\.me)[^"]*)"')
ringkas = Counter()
akan = []
for p in posts:
    raw = p.get("content", {}).get("raw", "")
    hasil, n = POLA.subn(lambda mm: f'href="{TARGET_HTML}"' if not mm.group(1).startswith(TARGET) else mm.group(0), raw)
    if n and hasil != raw:
        akan.append((p["id"], p["slug"], n))
        ringkas[n] += 1
print(f"artikel dengan tautan WA perlu diseragamkan: {len(akan)}")
print(f"   (sebaran jumlah tautan per artikel: {dict(sorted(ringkas.items()))})")
tanpa_wa = [p["id"] for p in posts if not POLA.search(p.get("content", {}).get("raw", ""))]
print(f"artikel tanpa tautan WA sama sekali: {len(tanpa_wa)}")

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

print("\n=== menulis ===")
ok = gagal = 0
for i, (pid, slug, n) in enumerate(akan, 1):
    d = rest(f"/wp-json/wp/v2/posts/{pid}?context=edit&_fields=content")
    raw = d.get("content", {}).get("raw", "")
    open(f"{BACKUP}/post_{pid}.txt", "w").write(raw)
    baru = POLA.sub(lambda mm: f'href="{TARGET_HTML}"' if not mm.group(1).startswith(TARGET) else mm.group(0), raw)
    if baru == raw:
        continue
    rest(f"/wp-json/wp/v2/posts/{pid}", "POST", {"content": baru})
    cek = rest(f"/wp-json/wp/v2/posts/{pid}?context=edit&_fields=content")
    raw2 = cek.get("content", {}).get("raw", "") if isinstance(cek, dict) else ""
    semua_target = all(t.startswith(TARGET) for t in POLA.findall(raw2))
    lain = [t for t in POLA.findall(raw2) if not t.startswith(TARGET)]
    if semua_target:
        ok += 1
    else:
        gagal += 1
        print(f"   ⚠️ #{pid} masih ada tautan lain: {lain[:2]}")
    if i % 25 == 0 or i == len(akan):
        print(f"   progres {i}/{len(akan)} | beres {ok} | bermasalah {gagal}")

print("\n=== verifikasi seluruh situs ===")
posts2, page = [], 1
while True:
    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
    posts2 += d
    if len(d) < 100:
        break
    page += 1
bentuk = Counter()
for p in posts2:
    for t in POLA.findall(p.get("content", {}).get("raw", "")):
        nomor = re.search(r"phone=([^&\"']+)|wa\.me/([^?\"']+)", t)
        bentuk[(nomor.group(1) or nomor.group(2)) if nomor else "?"] += 1
print("   nomor yang tersisa di artikel:", dict(bentuk))
sisa_lain = sum(v for k, v in bentuk.items() if k not in ("6285194936363",))
print(f"   tautan dengan nomor lain: {sisa_lain}")
