#!/usr/bin/env python3
"""Pass link internal LEIT: bangun blok 'Baca Juga' ke artikel query uang + silang antar artikel.
Idempoten: skip kalau 'Baca Juga' sudah ada. Jalankan tanpa argumen = dry run."""
import base64, html, json, os, re, sys, urllib.request, urllib.error

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

MONEY = {
    3928: ("https://www.leitsurabaya.com/kursus-bahasa-inggris-surabaya-timur/",
           ["kursus bahasa Inggris di Surabaya Timur", "les bahasa Inggris area Surabaya Timur", "LEIT Surabaya Timur"]),
    3925: ("https://www.leitsurabaya.com/kursus-bahasa-inggris-surabaya-barat/",
           ["kursus bahasa Inggris di Surabaya Barat", "les bahasa Inggris area Surabaya Barat", "LEIT Surabaya Barat"]),
    3902: ("https://www.leitsurabaya.com/les-bahasa-inggris-terdekat-surabaya/",
           ["les bahasa Inggris terdekat di Surabaya", "tempat les Inggris terdekat dari rumah"]),
    3903: ("https://www.leitsurabaya.com/7-tempat-les-bahasa-inggris-terdekat-surabaya/",
           ["7 tempat les bahasa Inggris terdekat di Surabaya", "rekomendasi tempat les terdekat di Surabaya"]),
    3904: ("https://www.leitsurabaya.com/alasan-les-bahasa-inggris-terdekat-rumah/",
           ["alasan les bahasa Inggris terdekat dari rumah", "kenapa les dekat rumah lebih efektif"]),
    3825: ("https://www.leitsurabaya.com/kursus-bahasa-inggris-paling-terjangkau-surabaya/",
           ["kursus bahasa Inggris paling terjangkau di Surabaya", "biaya kursus bahasa Inggris di Surabaya"]),
    3827: ("https://www.leitsurabaya.com/7-rekomendasi-kursus-bahasa-inggris-terjangkau-surabaya/",
           ["rekomendasi kursus bahasa Inggris terjangkau", "rekomendasi tempat kursus di Surabaya"]),
}
STOP = set("dan yang untuk dari dengan pada di ke the a an of to in and or ini itu bisa gak tidak".split())
TOPIK = {
    "anak": ("anak", "tk", "sd", "balita", "remaja", "orang tua", "public speaking"),
    "karier": ("karyawan", "dewasa", "gaji", "karier", "wawancara", "cv", "kerja", "profesional"),
    "studi": ("beasiswa", "study abroad", "traveling", "toefl", "ielts", "luar negeri", "kuliah"),
}
DEFAULT = (3928, 3925, 3825)


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
print("artikel:", len(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}


idx = {p["id"]: {"title": p["title"]["rendered"], "slug": p["slug"], "content": p["content"]["raw"]} for p in posts}

plan = {}
for p in posts:
    pid = p["id"]
    raw = p["content"]["raw"]
    if "Baca Juga" in raw or "baca-juga" in raw.lower():
        continue
    if pid in MONEY:
        teks = (idx[pid]["title"] + " " + idx[pid]["slug"]).lower()
        target = [t for t in MONEY if t != pid]
    else:
        teks = (p["title"]["rendered"] + " " + p["slug"]).lower()
        grup = [k for k, kws in TOPIK.items() if any(kw in teks for kw in kws)]
        if grup == ["anak"]:
            target = [3928, 3903, 3825]
        elif grup == ["karier"]:
            target = [3825, 3925, 3902]
        elif grup == ["studi"]:
            target = [3827, 3903, 3928]
        elif grup in (["anak", "karier"], ["anak", "studi"], ["karier", "studi"]):
            target = [3928, 3825, 3902]
        else:
            target = list(DEFAULT)
    skor = []
    for t in target:
        if t not in MONEY:
            continue
        url, anchors = MONEY[t]
        if url in raw:
            continue
        tt = toks(idx[t]["title"] + " " + idx[t]["slug"]) if t in idx else toks(url)
        skor.append((len(toks(teks) & tt), t, url, anchors))
    skor.sort(reverse=True)
    pilih = skor[:3]
    if pilih:
        plan[pid] = pilih

print("artikel yang akan ditambahi blok 'Baca Juga':", len(plan))
for pid, pilih in list(plan.items())[:8]:
    print(f"  #{pid} {idx[pid]['title'][:50]}")
    for sk, t, url, anc in pilih:
        print(f"     skor {sk} → #{t} {anc[0]}")

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

ok = gagal = 0
for pid, pilih in plan.items():
    links = "\n".join(f'<li><a href="{url}">{anchors[pid % len(anchors)]}</a></li>' for s, t, url, anchors in pilih)
    blok = f"\n<h2>Baca Juga</h2>\n<ul>{links}</ul>\n"
    raw = idx[pid]["content"]
    m = re.search(r"\n<h2>\s*Kesimpulan", raw, re.I)
    if m:
        baru = raw[:m.start()] + blok + raw[m.start():]
    else:
        baru = raw.rstrip() + "\n" + blok
    st, res = api(f"/wp-json/wp/v2/posts/{pid}", {"content": baru}, "POST")
    ada = isinstance(res, dict) and "Baca Juga" in json.dumps(res)
    print(f"  #{pid} POST {st} | tersimpan: {'Y' if ada else 'N'}")
    ok += 1 if ada else 0
    gagal += 0 if ada else 1
print(f"\nselesai: {ok} berhasil | {gagal} gagal")
