#!/usr/bin/env python3
"""TSLaw: buat skema FAQ untuk artikel yang pertanyaannya ditulis <p><strong>…?</strong></p>."""
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_tslaw", f"{WS}/cfg_tslaw.py")
m = importlib.util.module_from_spec(spec); spec.loader.exec_module(m)
DOM, AUTH = "www.tslaw.id", base64.b64encode(f'{m.CFG["user"]}:{m.CFG["pass"]}'.encode()).decode()
UA = {"User-Agent": "Mozilla/5.0"}
BACKUP = f"{WS}/tslaw_pemulihan/faq2"
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"


def bersih(t):
    return html.unescape(re.sub(r"\s+", " ", re.sub(r"<[^>]+>", "", t))).strip()


def pasangan_dari_strong(raw):
    """Ambil pasangan dari pola <p><strong>Tanya?</strong></p><p>Jawab</p> setelah penanda FAQ."""
    pos = None
    for pola in (r"<h2[^>]*>[^<]*(?:faq|pertanyaan yang sering|tanya jawab)[^<]*</h2>",
                 r"<p[^>]*><strong>[^<]*FAQ[^<]*</strong></p>"):
        mm = re.search(pola, raw, re.I)
        if mm:
            pos = mm.end()
            break
    if pos is None:
        return []
    bagian = raw[pos:pos + 6000]
    hasil = []
    # pola: <p><strong>pertanyaan?</strong></p> lalu <p>jawaban</p>
    for mm in re.finditer(r"<p[^>]*>\s*<strong>(.*?\?)</strong>\s*</p>\s*(<p[^>]*>.*?</p>)", bagian, re.S | re.I):
        q, a = bersih(mm.group(1)), bersih(mm.group(2))
        if len(q) > 12 and len(a) > 40:
            hasil.append((q[:180], a[:600]))
    return hasil[:10]


st, d = rest("/wp-json/wp/v2/posts?per_page=100&status=publish&context=edit&_fields=id,slug,content")
raci = []
for p in (d if isinstance(d, list) else []):
    raw = p["content"]["raw"] or ""
    if "FAQPage" in raw:
        continue
    pasangan = pasangan_dari_strong(raw)
    if len(pasangan) >= 3:
        raci.append({"id": p["id"], "slug": p["slug"], "raw": raw, "pasangan": pasangan})

print(f"artikel yang bisa diberi skema (pola <strong>): {len(raci)}")
for r in raci:
    print(f"   #{r['id']:>5} /{r['slug'][:46]:<48} {len(r['pasangan'])} pasangan")
    for q, a in r["pasangan"][:2]:
        print(f"        «{q[:70]}»")

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

ok = 0
for r in raci:
    skema = ('\n<script type="application/ld+json">' + json.dumps(
        {"@context": "https://schema.org", "@type": "FAQPage",
         "mainEntity": [{"@type": "Question", "name": q,
                         "acceptedAnswer": {"@type": "Answer", "text": a}} for q, a in r["pasangan"]]},
        ensure_ascii=False) + "</script>\n")
    baru = r["raw"].rstrip() + skema
    open(f"{BACKUP}/post_{r['id']}.txt", "w").write(r["raw"])
    rest(f"/wp-json/wp/v2/posts/{r['id']}", "POST", {"content": baru})
    st2, 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 ""
    bagus = "FAQPage" in raw2
    ok += 1 if bagus else 0
    print(f"   #{r['id']} {'✅' if bagus else '⚠️'} | FAQPage: {'ada' if bagus else 'tidak'} | {len(r['raw'])} → {len(raw2)}")
print(f"\nselesai: {ok}/{len(raci)}")
