#!/usr/bin/env python3
"""TSLaw: perbaiki tautan internal yang masih menunjuk /practice-areas/ (slug lama) -> /layanan/.
Menyimpan salinan tiap konten ke berkas lokal SEBELUM mengubah (pelajaran insiden)."""
import base64, json, os, re, sys, time, urllib.request, urllib.error

DOM = "tslaw.id"
AUTH = base64.b64encode(b"bambangbot:EFKm EYGx VQCP Y9go ncPr uM2Y").decode()
UA = {"User-Agent": "Mozilla/5.0"}
BACKUP = "/home/mantapman/.hermes/profiles/atun/workspace/tslaw_pemulihan/salinan_link"
os.makedirs(BACKUP, exist_ok=True)
LAMA, BARU = "/practice-areas/", "/layanan/"


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=180) as x:
                return x.status, json.loads(x.read())
        except urllib.error.HTTPError as e:
            return e.code, e.read().decode()[:250]
        except Exception:
            time.sleep(4)
    return 0, "gagal"


print("=== cari konten yang masih memuat tautan lama ===")
kandidat = []
for tipe in ("posts", "pages"):
    page = 1
    while True:
        st, d = rest(f"/wp-json/wp/v2/{tipe}?per_page=100&page={page}&context=edit&_fields=id,title,link,content")
        if not isinstance(d, list):
            break
        for p in d:
            raw = p.get("content", {}).get("raw", "") if isinstance(p.get("content"), dict) else ""
            n = raw.count(LAMA)
            if n:
                kandidat.append({"tipe": tipe, "id": p["id"], "judul": p["title"]["rendered"][:52], "n": n, "raw": raw})
        if len(d) < 100:
            break
        page += 1

print(f"   {len(kandidat)} konten memuat '{LAMA}'")
for k in kandidat:
    print(f"     {k['tipe'][:-1]:<6} #{k['id']:>5} {k['n']}x  {k['judul']}")

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

print("\n=== perbaikan ===")
for k in kandidat:
    simpan = f"{BACKUP}/{k['tipe']}_{k['id']}.txt"
    open(simpan, "w").write(k["raw"])          # salinan pengaman
    baru = k["raw"].replace(LAMA, BARU)
    st, res = rest(f"/wp-json/wp/v2/{k['tipe']}/{k['id']}", "POST", {"content": baru})
    st2, cek = rest(f"/wp-json/wp/v2/{k['tipe']}/{k['id']}?context=edit&_fields=content")
    raw2 = cek.get("content", {}).get("raw", "") if isinstance(cek, dict) else ""
    print(f"  {k['tipe'][:-1]:<6} #{k['id']:>5} | HTTP {st} | sisa tautan lama: {raw2.count(LAMA)} | "
          f"tautan baru: {raw2.count(BARU)} | {'✅' if raw2.count(LAMA) == 0 else '❌'} | salinan: {os.path.basename(simpan)}")

print("\n=== verifikasi akhir di seluruh situs ===")
total = 0
for tipe in ("posts", "pages"):
    page = 1
    while True:
        st, d = rest(f"/wp-json/wp/v2/{tipe}?per_page=100&page={page}&context=edit&_fields=id,content")
        if not isinstance(d, list):
            break
        for p in d:
            raw = p.get("content", {}).get("raw", "") if isinstance(p.get("content"), dict) else ""
            if LAMA in raw:
                total += 1
                print(f"     masih ada di {tipe[:-1]} #{p['id']}")
        if len(d) < 100:
            break
        page += 1
print(f"   sisa konten dengan tautan lama: {total}")
