#!/usr/bin/env python3
"""TSC: pass tautan internal untuk artikel — setiap artikel mendapat blok 'Baca juga' berisi 3 artikel terkait.
Salinan tiap artikel disimpan ke disk sebelum diubah. Jalankan --apply untuk eksekusi."""
import base64, html, json, os, re, sys, time, urllib.request, urllib.error, importlib.util

WS = "/home/mantapman/.hermes/profiles/atun/workspace"
spec = importlib.util.spec_from_file_location("cfg_tsc", f"{WS}/cfg_tsc.py")
mod = importlib.util.module_from_spec(spec); spec.loader.exec_module(mod)
CFG = mod.CFG
DOM, USER, PASS = CFG["domain"], CFG["user"], CFG["pass"]
AUTH = base64.b64encode(f"{USER}:{PASS}".encode()).decode()
UA = {"User-Agent": "Mozilla/5.0"}
BACKUP = f"{WS}/tsc_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 dokter kulit klinik krian sidoarjo indonesia the skin code clinic 2026 anda yang atau agar".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()[:200]
        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")

for p in posts:
    raw = p.get("content", {}).get("raw", "")
    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=== menyusun pasangan ===")
rencana = []
for p in posts:
    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"]))
    tujuan = [q for _, q in skor[:3]]
    rencana.append({"id": p["id"], "slug": p["slug"], "sudah": p["_sudah"],
                    "tujuan": [(q["id"], q["link"], q["_judul"][:70]) for q in tujuan]})

belum = [r for r in rencana if not r["sudah"] and r["tujuan"]]
print(f"   akan diberi blok: {len(belum)} artikel")
for r in belum[:5]:
    print(f"   #{r['id']} {r['slug'][:40]}")
    for t in r["tujuan"]:
        print(f"      → {t[2][:60]}")

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

BLOCK = ('<h2>Baca juga</h2>\n<p>Artikel berikut masih berkaitan dengan topik di atas: {isi}.</p>\n')
print("\n=== menulis ===")
ok = gagal = 0
for i, r in enumerate(belum, 1):
    p = next(x for x in posts if x["id"] == r["id"])
    open(f"{BACKUP}/post_{r['id']}.txt", "w").write(p["_raw"])
    tautan = ", ".join(f'<a href="{t[1]}">{t[2]}</a>' for t in r["tujuan"])
    st, _ = rest(f"/wp-json/wp/v2/posts/{r['id']}", "POST", {"content": p["_raw"].rstrip() + "\n" + BLOCK.format(isi=tautan)})
    time.sleep(0.3)
    if i % 20 == 0 or i == len(belum):
        print(f"   progres {i}/{len(belum)}")

print("\n=== verifikasi ===")
punya = 0
page = 1
while True:
    st, d = rest(f"/wp-json/wp/v2/posts?per_page=100&page={page}&status=publish&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 "baca juga" in raw.lower():
            punya += 1
    if len(d) < 100:
        break
    page += 1
print(f"   artikel dengan blok 'Baca juga': {punya}")
