#!/usr/bin/env python3
"""TSLaw: pass tautan internal untuk 56 artikel.
Setiap artikel mendapat blok 'Baca juga' berisi 3 artikel terkait (dipilih dari kemiripan topik).
Menyimpan salinan tiap artikel ke disk SEBELUM menulis. Jalankan --apply untuk eksekusi."""
import base64, html, json, os, re, sys, time, urllib.request, urllib.error
from collections import Counter

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)
STOP = set("yang untuk dan dari dengan pada dalam adalah ini itu cara tips panduan lengkap penting "
           "mengapa kenapa bagaimana hukum di ke atau agar supaya bisnis usaha surabaya indonesia 2026".split())


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"


def kata_kunci(teks):
    return {w for w in re.findall(r"[a-z]{4,}", teks.lower()) if w not in STOP}


print("=== menarik artikel ===")
posts = []
page = 1
while True:
    st, d = rest(f"/wp-json/wp/v2/posts?per_page=100&page={page}&status=publish"
                 f"&context=edit&_fields=id,slug,link,title,content")
    if not isinstance(d, list):
        break
    posts += d
    if len(d) < 100:
        break
    page += 1
print(f"   {len(posts)} artikel terbit")

for p in posts:
    raw = p.get("content", {}).get("raw", "") if isinstance(p.get("content"), dict) else ""
    p["_raw"] = raw
    p["_judul"] = html.unescape(p["title"]["rendered"])
    p["_kw"] = kata_kunci(p["slug"].replace("-", " ") + " " + p["_judul"])
    p["_sudah"] = "baca juga" in raw.lower()

print("\n=== pasangan tautan yang direncanakan ===")
rencana = []
for p in posts:
    kalau_sudah = p["_sudah"]
    skor = []
    for q in posts:
        if q["id"] == p["id"]:
            continue
        s = len(p["_kw"] & q["_kw"])
        if s:
            skor.append((s, q))
    skor.sort(key=lambda x: (-x[0], x[1]["id"]))
    pilihan = [q for _, q in skor[:3]]
    rencana.append({"id": p["id"], "slug": p["slug"], "sudah_ada": kalau_sudah,
                    "tujuan": [(q["id"], q["slug"], q["_judul"][:60], q["link"]) for q in pilihan]})

for r in rencana[:8]:
    print(f"   #{r['id']:>5} {r['slug'][:44]:<46}" + ("(sudah ada blok)" if r["sudah_ada"] else ""))
    for t in r["tujuan"]:
        print(f"          → #{t[0]} {t[1][:52]}")

belum = [r for r in rencana if not r["sudah_ada"] and r["tujuan"]]
print(f"\n   artikel yang akan diberi blok: {len(belum)} dari {len(rencana)}")

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

BLOCK = ('<h2>Baca juga</h2>\n<p>Kalau topiknya berhubungan dengan kebutuhan Anda, '
         'artikel berikut membahasnya lebih dalam: {isi}.</p>')
print("\n=== menulis ===")
ok_gagal = {"ok": 0, "gagal": 0}
for r in belum:
    p = next(x for x in posts if x["id"] == r["id"])
    open(f"{BACKUP}/post_{r['id']}.txt", "w").write(p["_raw"])          # salinan pengaman
    tautan = ", ".join(f'<a href="{t[3]}">{t[2]}</a>' for t in r["tujuan"])
    tambahan = "\n" + BLOCK.format(isi=tautan) + "\n"
    st, res = rest(f"/wp-json/wp/v2/posts/{r['id']}", "POST", {"content": p["_raw"].rstrip() + tambahan})
    st2, cek = rest(f"/wp-json/wp/v2/posts/{r['id']}?context=edit&_fields=content")
    raw2 = cek.get("content", {}).get("raw", "") if isinstance(cek, dict) else ""
    sukses = "baca juga" in raw2.lower() and raw2.count("tslaw.id") > p["_raw"].count("tslaw.id")
    ok_gagal["ok" if sukses else "gagal"] += 1
    print(f"   #{r['id']:>5} {r['slug'][:40]:<42} HTTP {st} | {'✅' if sukses else '❌'}")

print(f"\n   berhasil: {ok_gagal['ok']} | gagal: {ok_gagal['gagal']}")
