#!/usr/bin/env python3
"""Simpanan bahan artikel per situs — supaya tidak perlu menarik ratusan artikel berulang kali.

Pakai:
    from konten_cache import ambil
    data = ambil("cfg_tslaw.py")             # pakai simpanan kalau belum lewat 24 jam
    data = ambil("cfg_tslaw.py", paksa=True) # tarik ulang

Aturan: satu situs satu berkas di cache/konten_<situs>.json, dipakai ulang maksimal 24 jam.
"""
import base64, importlib.util, json, os, time, urllib.request

WS = "/home/mantapman/.hermes/profiles/atun/workspace"
CACHE = f"{WS}/cache"
os.makedirs(CACHE, exist_ok=True)


def _rest(dom, H, path, ulang=3):
    akhir = ""
    for i in range(ulang):
        try:
            return json.loads(urllib.request.urlopen(
                urllib.request.Request(f"https://{dom}{path}", headers=H), timeout=150).read())
        except Exception as e:
            akhir = str(e)[:40]
            time.sleep(4 + i * 4)
    raise RuntimeError(akhir)


def ambil(cfg_berkas, paksa=False, jam=24, dengan_isi=True):
    # bersihkan simpanan yang sudah terlalu tua (lebih dari 7 hari) supaya tidak menumpuk
    for f in os.listdir(CACHE):
        p = os.path.join(CACHE, f)
        if f.endswith(".json") and os.path.isfile(p) and (time.time() - os.path.getmtime(p)) > 7 * 86400:
            try:
                os.remove(p)
            except Exception:
                pass

    nama = cfg_berkas.replace("cfg_", "").replace(".py", "")
    berkas = f"{CACHE}/konten_{nama}.json"
    if not paksa and os.path.exists(berkas) and (time.time() - os.path.getmtime(berkas)) < jam * 3600:
        d = json.load(open(berkas))
        umur = int((time.time() - os.path.getmtime(berkas)) / 60)
        print(f"[cache] {nama}: {len(d)} entri · umur {umur} menit (tarik ulang setelah {jam} jam)")
        return d

    spec = importlib.util.spec_from_file_location("c", f"{WS}/{cfg_berkas}")
    m = importlib.util.module_from_spec(spec)
    spec.loader.exec_module(m)
    C = m.CFG
    dom = C.get("domain", C.get("situs"))
    A = base64.b64encode(f"{C['user']}:{C['pass']}".encode()).decode()
    H = {"Authorization": f"Basic {A}", "User-Agent": "Mozilla/5.0"}

    hasil, n_req = {}, 0
    for jenis in ("posts", "pages"):
        hal = 1
        while hal <= 12:
            try:
                d = _rest(dom, H, f"/wp-json/wp/v2/{jenis}?per_page=50&page={hal}"
                                  "&status=publish&_fields=id,slug,link,title")
            except Exception:
                break
            n_req += 1
            if not isinstance(d, list) or not d:
                break
            for x in d:
                hasil[f"{jenis}:{x['id']}"] = {"jenis": jenis, "id": x["id"], "slug": x["slug"],
                                               "link": x.get("link", ""),
                                               "judul": x.get("title", {}).get("rendered", "")}
            if len(d) < 50:
                break
            hal += 1

    if dengan_isi:
        for p in hasil.values():
            try:
                c = _rest(dom, H, f"/wp-json/wp/v2/{p['jenis']}/{p['id']}?context=edit&_fields=content")
                p["content"] = c["content"]["raw"]
                n_req += 1
            except Exception:
                p["content"] = ""
            time.sleep(0.15)

    json.dump(hasil, open(berkas, "w"), ensure_ascii=False)
    print(f"[baru] {nama}: {len(hasil)} entri · {n_req} permintaan → cache/konten_{nama}.json")
    return hasil


if __name__ == "__main__":
    import sys
    ambil(sys.argv[1] if len(sys.argv) > 1 else "cfg_tslaw.py")
