#!/usr/bin/env python3
"""Perbaiki SEMUA kemunculan tautan mati di StudioSoft (bukan hanya beberapa sumber pertama).

Satu kali jalan: ambil isi tiap artikel/halaman, ganti/lepas seluruh tautan mati, simpan kembali.
Jalankan tanpa argumen = uji. Dengan --go = kerjakan.
"""
import base64, json, re, sys, time, urllib.request

WS = "/home/mantapman/.hermes/profiles/atun/workspace"
DOM = "studiosoft.id"
S = f"https://{DOM}"
AUTH = base64.b64encode(b"bambangbot:q26r RePo BVy6 pwU2 F3z7 ouyl").decode()
H = {"Authorization": f"Basic {AUTH}", "User-Agent": "Mozilla/5.0", "Content-Type": "application/json"}
UA = {"User-Agent": "Mozilla/5.0"}

# tautan yang tidak perlu disentuh: hasil pembacaan sendiri + sosial media yang menolak bot
LEWATI = ("/wp-json/", "facebook.com", "instagram.com", "x.com", "twitter.com", "tiktok.com",
          "youtube.com", "wa.me", "whatsapp.com")
PETA = {
    "https://studiosoft.id/blog": "https://studiosoft.id/artikel/",
    "https://studiosoft.id/blog/": "https://studiosoft.id/artikel/",
    "https://studiosoft.id/konsultasi/": "https://studiosoft.id/kontak/",
    "https://studiosoft.id/google-business-profile-untuk-klinik/":
        "https://studiosoft.id/google-business-profile-klinik/",
    "https://studiosoft.id/panduan-seo-untuk-klinik-dan-rumah-sakit/":
        "https://studiosoft.id/panduan-seo-klinik-rumah-sakit/",
    "https://studiosoft.id/analitik-digital-bisnis-properti/": "https://studiosoft.id/analitik-properti/",
    "https://studiosoft.id/data-analytics-rumah-sakit-kebutuhan-pasien/":
        "https://studiosoft.id/7-strategi-digital-marketing-rumah-sakit-untuk-menambah-pasien-setiap-bulan/",
    "https://studiosoft.id/digital-marketing-bisnis-keuangan/": "https://studiosoft.id/marketing-keuangan/",
    "https://studiosoft.id/digital-marketing-bisnis-retail/": "https://studiosoft.id/digital-marketing-retail/",
    "https://studiosoft.id/digital-marketing-bisnis-properti/": "https://studiosoft.id/digital-marketing-properti/",
    "https://studiosoft.id/digital-marketing-bisnis-manufaktur/": "https://studiosoft.id/marketing-manufaktur/",
    "https://studiosoft.id/iklan-facebook-rumah-sakit/":
        "https://studiosoft.id/7-strategi-digital-marketing-rumah-sakit-untuk-menambah-pasien-setiap-bulan/",
    "https://studiosoft.id/klinik-kecil-butuh-digital-marketing/":
        "https://studiosoft.id/jasa-digital-marketing-klinik/",
    "https://studiosoft.id/seo-untuk-bisnis-properti/": "https://studiosoft.id/seo-properti/",
    "https://studiosoft.id/social-media-rumah-sakit-efektif/":
        "https://studiosoft.id/7-strategi-digital-marketing-rumah-sakit-untuk-menambah-pasien-setiap-bulan/",
    "https://studiosoft.id/strategi-digital-marketing-rumah-sakit/":
        "https://studiosoft.id/7-strategi-digital-marketing-rumah-sakit-untuk-menambah-pasien-setiap-bulan/",
}
GO = "--go" in sys.argv


def rest(p, method="GET", data=None, ulang=4):
    body = json.dumps(data).encode() if data is not None else None
    akhir = ""
    for i in range(ulang):
        try:
            r = urllib.request.Request(S + p, data=body, headers=H, method=method)
            with urllib.request.urlopen(r, timeout=180) as x:
                return json.loads(x.read())
        except Exception as e:
            akhir = str(e)[:50]
            time.sleep(5 + i * 5)
    raise RuntimeError(akhir)


print("=== kumpulkan tautan mati ===")
mati = json.load(open(f"{WS}/drafts/ss_tautan_mati.json"))
DAFTAR_MATI = [u for u in mati if not any(k in u for k in LEWATI)]
print(f"   {len(DAFTAR_MATI)} tautan mati yang akan dibersihkan menyeluruh")

print("\n=== periksa tujuan penggantinya masih hidup ===")
for u in sorted(set(PETA.values())):
    try:
        with urllib.request.urlopen(urllib.request.Request(u, headers=UA), timeout=30) as r:
            st = r.status
    except Exception as e:
        st = str(e)[:34]
    print(f"   {st} · {u.replace('https://studiosoft.id', '')}")

print("\n=== daftar artikel & halaman ===")
daftar = []
for jenis in ("posts", "pages"):
    hal = 1
    while hal <= 12:
        try:
            d = rest(f"/wp-json/wp/v2/{jenis}?per_page=50&page={hal}&status=publish&_fields=id,slug")
        except Exception as e:
            print(f"   {jenis} hal {hal} gagal: {e}")
            break
        if not isinstance(d, list) or not d:
            break
        daftar += [(jenis, x["id"], x["slug"]) for x in d]
        if len(d) < 50:
            break
        hal += 1
print(f"   {len(daftar)} entri")

print("\n=== bersihkan ===")
cadangan, total, entri_berubah = {}, 0, 0
for i, (jenis, pid, slug) in enumerate(daftar, 1):
    try:
        c = rest(f"/wp-json/wp/v2/{jenis}/{pid}?context=edit&_fields=content")
        isi = c["content"]["raw"]
    except Exception as e:
        print(f"   #{pid} gagal ambil: {e}")
        continue
    asli = isi
    rincian = []
    for u in DAFTAR_MATI:
        pola = re.compile(r'<a[^>]+href="' + re.escape(u) + r'"[^>]*>(.*?)</a>', re.S)
        n = len(pola.findall(isi))
        if not n:
            continue
        pengganti = PETA.get(u)
        if pengganti:
            isi = pola.sub(lambda mo: f'<a href="{pengganti}">{mo.group(1)}</a>', isi)
            rincian.append(f"{n}× diganti → {pengganti.replace('https://studiosoft.id', '')}")
        else:
            isi = pola.sub(lambda mo: mo.group(1), isi)
            rincian.append(f"{n}× dilepas · {u[:60]}")
        total += n
    if isi != asli:
        entri_berubah += 1
        cadangan[f"{jenis}:{pid}"] = asli
        print(f"   [{i}/{len(daftar)}] #{pid} {slug[:44]:<46}")
        for r in rincian:
            print(f"        {r}")
        if GO:
            try:
                rest(f"/wp-json/wp/v2/{jenis}/{pid}", "POST", {"content": isi})
            except Exception as e:
                print(f"        gagal simpan: {e}")
            time.sleep(0.6)

if GO:
    json.dump(cadangan, open(f"{WS}/ss_backup_tautan_mati_lengkap.json", "w"), ensure_ascii=False)
    print(f"\n✅ {total} kemunculan tautan dibersihkan di {entri_berubah} artikel/halaman")
    print("   cadangan: ss_backup_tautan_mati_lengkap.json")
else:
    print(f"\n(uji) {total} kemunculan di {entri_berubah} entri. Pakai --go untuk mengerjakan.")
