#!/usr/bin/env python3
"""DAS: rapikan label tombol yang masih huruf kecil ('ambil promo' → 'AMBIL PROMO').
Hanya menyasar label tombol yang persis, bukan kalimat di dalam paragraf."""
import base64, 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_das", f"{WS}/cfg_das.py")
m = importlib.util.module_from_spec(spec); spec.loader.exec_module(m)
CFG = m.CFG
DOM, AUTH = CFG["domain"], base64.b64encode(f'{CFG["user"]}:{CFG["pass"]}'.encode()).decode()
UA = {"User-Agent": "Mozilla/5.0"}
BACKUP = f"{WS}/das_pemulihan/label"
os.makedirs(BACKUP, exist_ok=True)


def rest(p, 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}{p}", data=body, headers=h, method=method)
    for _ in range(3):
        try:
            with urllib.request.urlopen(r, timeout=200) 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(5)
    return 0, "gagal"


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

rencana = []
for p in posts:
    raw = p.get("content", {}).get("raw", "") or ""
    n = [0]

    def ganti(mm):
        label = mm.group(2)
        if label.strip() == "AMBIL PROMO":
            return mm.group(0)
        n[0] += 1
        return mm.group(1) + "AMBIL PROMO" + mm.group(2)

    # hanya label tombol persis: <a ...>ambil promo</a>
    baru = re.sub(r"(<a[^>]*>)\s*(ambil\s*promo)\s*(</a>)", ganti, raw, flags=re.I)
    if n[0]:
        rencana.append({"id": p["id"], "slug": p["slug"], "raw": raw, "baru": baru, "n": n[0]})

print(f"rencana: {len(rencana)} artikel, {sum(r['n'] for r in rencana)} label dirapikan")
for r in rencana:
    print(f"   #{r['id']} /{r['slug'][:50]} ({r['n']} label)")

if "--apply" not in sys.argv:
    print("(dry run)")
    sys.exit(0)

for r in rencana:
    open(f"{BACKUP}/post_{r['id']}.txt", "w").write(r["raw"])
    rest(f"/wp-json/wp/v2/posts/{r['id']}", "POST", {"content": r["baru"]})
    _, 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 ""
    POLA_KECIL = r">\s*ambil promo\s*<"
    bagus = "AMBIL PROMO" in raw2 and not re.search(POLA_KECIL, raw2, re.I)
    print(f"   #{r['id']} → {'✅' if bagus else '⚠️'}")
