#!/usr/bin/env python3
"""Pass 3: pastikan 3 artikel yang masih minim penaut masuk (#3864, #4059, #4141) dapat link.
Menambah baris 'Baca juga:' (paragraf) agar tidak bentrok batas 5 item di blok Baca Juga."""
import base64, html, json, re, sys, urllib.request, urllib.error

SITE = "https://www.leitsurabaya.com"
AUTH = base64.b64encode(b"bambangbot:zibd dLIV xY8x onP9 39qL hiNr").decode()

LAG = {
    3864: "soft skills paling dicari di era AI",
    4059: "jangan nunggu siap untuk mulai belajar Inggris",
    4141: "contoh pertanyaan wawancara kerja bahasa Inggris",
}
BUTUH = 4  # minimal penaut masuk per target
STOP = set("dan yang untuk dari dengan pada di ke the a an of to in and or ini itu bisa gak tidak leit".split())


def api(path, data=None, method="GET"):
    h = {"Authorization": f"Basic {AUTH}", "User-Agent": "Mozilla/5.0"}
    body = None
    if data is not None:
        body = json.dumps(data).encode()
        h["Content-Type"] = "application/json"
    r = urllib.request.Request(SITE + path, data=body, headers=h, method=method)
    try:
        with urllib.request.urlopen(r, timeout=240) as x:
            return x.status, json.loads(x.read())
    except urllib.error.HTTPError as e:
        return e.code, e.read().decode()[:200]


posts, page = [], 1
while True:
    st, d = api(f"/wp-json/wp/v2/posts?per_page=100&page={page}&context=edit&_fields=id,link,slug,title,content")
    posts += d
    if len(d) < 100:
        break
    page += 1
idx = {p["id"]: p for p in posts}
urlmap = {p["id"]: p["link"] for p in posts}


def toks(s):
    return {w for w in re.findall(r"[a-zA-Z]{4,}", html.unescape(re.sub(r"<[^>]+>", " ", s)).lower()) if w not in STOP}


inb = {}
for p in posts:
    for o in set(re.findall(r'href="(https://www\.leitsurabaya\.com/[^"#?]+)"', p["content"]["raw"])):
        inb.setdefault(o.rstrip("/"), set()).add(p["id"])

tugas = {}   # source_pid -> list target
for t, anchor in LAG.items():
    ada = {p["id"] for p in posts if urlmap[t] in p["content"]["raw"]}
    kurang = BUTUH - len(ada)
    if kurang <= 0:
        print(f"#{t} sudah {len(ada)} penaut — skip")
        continue
    kandidat = []
    for p in posts:
        if p["id"] in ada or p["id"] == t:
            continue
        skor = len(toks(idx[t]["title"]["rendered"]) & toks(p["title"]["rendered"] + " " + p["slug"]))
        kandidat.append((skor, p["id"]))
    kandidat.sort(key=lambda x: (-x[0], x[1]))
    for sk, src in kandidat[:kurang]:
        tugas.setdefault(src, []).append((t, anchor, sk))
    print(f"#{t} butuh {kurang} → sumber: {[s for _, s in kandidat[:kurang]]}")

print(f"\nartikel yang akan diedit: {len(tugas)}")
if "--apply" not in sys.argv:
    print("(dry run)")
    sys.exit(0)

ok = gagal = 0
for src, targets in tugas.items():
    raw = idx[src]["content"]["raw"]
    items = []
    for t, anchor, sk in targets:
        if urlmap[t] not in raw:
            items.append(f'<a href="{urlmap[t]}">{anchor}</a>')
    if not items:
        continue
    blok = "\n<p><strong>Baca juga:</strong> " + ", ".join(items) + ".</p>\n"
    m = re.search(r"\n<h2>\s*Kesimpulan", raw, re.I)
    baru = (raw[:m.start()] + blok + raw[m.start():]) if m else (raw.rstrip() + "\n" + blok)
    st, res = api(f"/wp-json/wp/v2/posts/{src}", {"content": baru}, "POST")
    body = json.dumps(res) if isinstance(res, dict) else ""
    cek = all(urlmap[t] in body for t, a, s in targets)
    print(f"  #{src} POST {st} | {'Y' if cek else 'N'}")
    ok += 1 if cek else 0
    gagal += 0 if cek else 1
print(f"\npass 3: {ok} ok | {gagal} gagal")
