#!/usr/bin/env python3
"""Perbaiki teks yang masih menyebut merek lama di dalam artikel TSC (bukan slug).

- tagar "#KlinikDNIKrian" → "#TheSkinCodeClinic"
- teks tautan "Klinik Dni Krian" / "Klinik DNI Krian" → "The Skin Code Clinic"

Pakai --go untuk menulis. Salinan disimpan lebih dulu.
"""
import base64, importlib.util, json, os, re, sys, time, urllib.error, urllib.request

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

GANTI = [
    (re.compile(r"#\s*KlinikDNIKrian", re.I), "#TheSkinCodeClinic"),
    (re.compile(r"Klinik\s+Dni\s+Krian", re.I), "The Skin Code Clinic Krian"),
    (re.compile(r"Klinik\s+DNI\s+Krian", re.I), "The Skin Code Clinic Krian"),
    (re.compile(r"Klinik\s+DNI\b", re.I), "The Skin Code Clinic"),
]


def rest(path, 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}{path}", data=body, headers=h, method=method)
    for _ in range(3):
        try:
            with urllib.request.urlopen(r, timeout=120) 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(4)
    return 0, "gagal"


go = "--go" in sys.argv
total = 0
for pid in (1908, 1833):
    st, o = rest(f"/wp-json/wp/v2/posts/{pid}?context=edit&_fields=id,content,link,title")
    if not isinstance(o, dict):
        print(f"  ❌ #{pid} gagal dibaca")
        continue
    raw = o["content"]["raw"]
    baru = raw
    jumlah = 0
    for pola, ke in GANTI:
        n = len(pola.findall(baru))
        if n:
            baru = pola.sub(ke, baru)
            jumlah += n
    print(f"\n■ #{pid} {o['link'][:70]}")
    print(f"   penggantian: {jumlah}")
    for mc in re.finditer(r"[^<>]{0,120}(The Skin Code Clinic|#TheSkinCodeClinic)[^<>]{0,80}", baru):
        print(f"   → …{re.sub(chr(92) + 's+', ' ', mc.group(0)).strip()[:170]}…")
        break
    if jumlah and go:
        open(f"{BACKUP}/post_{pid}.txt", "w").write(raw)
        st2, _ = rest(f"/wp-json/wp/v2/posts/{pid}", "POST", {"content": baru})
        print(f"   HTTP {st2}")
        time.sleep(0.5)
    total += jumlah

print(f"\ntotal penggantian teks: {total}")
if not go:
    print("(dry run — pakai --go)")
