#!/usr/bin/env python3
"""Perbaiki ejaan 'Tito Supriyanto Law Firm' → 'Tito Suprianto Law Firm' di seluruh isi TSLaw.

Mencakup: isi artikel & halaman, judul, kutipan (excerpt), dan keterangan media (judul, alt, caption).
Pengaturan Yoast tidak bisa diubah lewat API — itu dilaporkan terpisah.
Jalankan tanpa argumen = uji. Dengan --go = perbaiki (dengan cadangan).
"""
import base64, importlib.util, json, re, sys, time, urllib.request

WS = "/home/mantapman/.hermes/profiles/atun/workspace"
spec = importlib.util.spec_from_file_location("cfg", f"{WS}/cfg_tslaw.py")
m = importlib.util.module_from_spec(spec)
spec.loader.exec_module(m)
C = m.CFG
DOM = C.get("domain", C.get("situs"))
A = base64.b64encode(f"{C['user']}:{C['pass']}".encode()).decode()
H = {"Authorization": f"Basic {A}", "User-Agent": "Mozilla/5.0", "Content-Type": "application/json"}
SALAH, BENAR = "Tito Supriyanto Law Firm", "Tito Suprianto Law Firm"
GO = "--go" in sys.argv
cadangan, n = {}, 0


def rest(path, method="GET", data=None):
    body = json.dumps(data).encode() if data is not None else None
    r = urllib.request.Request(f"https://{DOM}{path}", data=body, headers=H, method=method)
    with urllib.request.urlopen(r, timeout=180) as x:
        return json.loads(x.read())


def bersih(html):
    return re.sub(r"\s+", " ", re.sub("<[^>]+>", " ", html or "")).strip()


print("=== isi artikel & halaman ===")
for jenis in ("posts", "pages"):
    hal = 1
    while hal <= 3:
        try:
            d = rest(f"/wp-json/wp/v2/{jenis}?per_page=100&page={hal}&status=any&context=edit"
                     "&_fields=id,slug,status,link,title,content,excerpt")
        except Exception as e:
            print(f"   {jenis} hal {hal}: {str(e)[:50]}")
            break
        if not isinstance(d, list) or not d:
            break
        for p in d:
            untuk_simpan = {}
            if SALAH in p["content"]["raw"]:
                untuk_simpan["content"] = p["content"]["raw"].replace(SALAH, BENAR)
            if SALAH in p["title"]["raw"]:
                untuk_simpan["title"] = p["title"]["raw"].replace(SALAH, BENAR)
            if isinstance(p.get("excerpt"), dict) and SALAH in p["excerpt"]["raw"]:
                untuk_simpan["excerpt"] = p["excerpt"]["raw"].replace(SALAH, BENAR)
            if not untuk_simpan:
                continue
            n += 1
            print(f"   [{p['status']:<7}] #{p['id']:<5} {p['slug'][:52]:<54} → {list(untuk_simpan)}")
            cadangan[f"{jenis}:{p['id']}"] = {k: (p[k]["raw"] if isinstance(p.get(k), dict) else untuk_simpan[k])
                                              for k in untuk_simpan}
            if GO:
                rest(f"/wp-json/wp/v2/{jenis}/{p['id']}", "POST", untuk_simpan)
                time.sleep(0.7)
        if len(d) < 100:
            break
        hal += 1

print("\n=== keterangan media ===")
hal = 1
while hal <= 3:
    try:
        d = rest(f"/wp-json/wp/v2/media?per_page=100&page={hal}&context=edit"
                 "&_fields=id,slug,title,caption,description,alt_text")
    except Exception as e:
        print(f"   media hal {hal}: {str(e)[:50]}")
        break
    if not isinstance(d, list) or not d:
        break
    for mm in d:
        untuk_simpan = {}
        for k in ("title", "caption", "description"):
            v = mm.get(k)
            v = v.get("raw") if isinstance(v, dict) else v
            if v and SALAH in v:
                untuk_simpan[k] = v.replace(SALAH, BENAR)
        alt = mm.get("alt_text") or ""
        if SALAH in alt:
            untuk_simpan["alt_text"] = alt.replace(SALAH, BENAR)
        if not untuk_simpan:
            continue
        n += 1
        print(f"   media #{mm['id']:<6} {mm['slug'][:44]:<46} → {list(untuk_simpan)}")
        cadangan[f"media:{mm['id']}"] = untuk_simpan
        if GO:
            rest(f"/wp-json/wp/v2/media/{mm['id']}", "POST", untuk_simpan)
            time.sleep(0.7)
    if len(d) < 100:
        break
    hal += 1

if GO:
    json.dump(cadangan, open(f"{WS}/tslaw_backup_ejaan.json", "w"), ensure_ascii=False)
    print(f"\n✅ {n} objek diperbaiki · cadangan: tslaw_backup_ejaan.json")
else:
    print(f"\n(uji) {n} objek perlu diperbaiki. Pakai --go untuk memasang.")
