#!/usr/bin/env python3
"""TSLaw: (A) tambahkan tombol WhatsApp ke artikel yang belum punya,
(B) buatkan skema FAQ dari bagian FAQ yang sudah ada (isi yang terlihat, bukan karangan).
Pakai --apply untuk menulis; tiap artikel disalin dulu."""
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/wa_faq"
os.makedirs(BACKUP, exist_ok=True)
PETA = json.load(open(f"{WS}/drafts/tslaw_peta_perbaikan.json"))

TOMBOL = ('<p style="text-align:center;margin:32px 0 8px"><a '
          'href="https://wa.me/6281909222026?text=Halo%20TS%20Law%2C%20saya%20ingin%20berkonsultasi%20mengenai%20kebutuhan%20hukum%20saya" '
          'target="_blank" rel="noopener" style="display:inline-block;background-color:#1c2b4a;color:#ffffff;'
          'padding:15px 34px;font-size:19px;font-weight:bold;text-decoration:none;border-radius:6px;">'
          'Konsultasi via WhatsApp</a></p>')


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 ambil_pasangan_faq(raw):
    """Ambil pasangan pertanyaan-jawaban dari bagian FAQ. Hanya yang benar-benar ada di halaman."""
    pos = None
    for pola in (r"<h2[^>]*>[^<]*(?:pertanyaan yang sering|faq|tanya jawab)[^<]*</h2>",
                 r"<h3[^>]*>[^<]*(?:pertanyaan yang sering|faq)[^<]*</h3>"):
        mm = re.search(pola, raw, re.I)
        if mm:
            pos = mm.end()
            break
    bagian = raw[pos:] if pos else raw
    pasangan = []
    for mm in re.finditer(r"<h([34])[^>]*>(.*?)</h\1>(.*?)(?=<h[234][^>]*>|$)", bagian, re.S | re.I):
        tanya = bersih(mm.group(2))
        jawab = bersih(mm.group(3))
        if tanya.endswith("?") and len(tanya) > 12 and len(jawab) > 40:
            pasangan.append((tanya[:170], jawab[:600]))
    return pasangan[:8]


def buat_skema(pasangan):
    isi = [{"@type": "Question", "name": q, "acceptedAnswer": {"@type": "Answer", "text": a}} for q, a in pasangan]
    return ('\n<script type="application/ld+json">' +
            json.dumps({"@context": "https://schema.org", "@type": "FAQPage", "mainEntity": isi},
                       ensure_ascii=False) + "</script>\n")


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,title,content")
    if not isinstance(d, list):
        break
    posts += d
    if len(d) < 100:
        break
    page += 1

print(f"artikel: {len(posts)}")
rencana = []
for p in posts:
    raw = p["content"]["raw"] or ""
    aksi, baru = [], raw

    # A. tombol WhatsApp
    if not re.search(r"wa\.me|api\.whatsapp|whatsapp\.com", baru, re.I):
        sisip = baru.find("<script")
        if sisip == -1:
            sisip = len(baru)
        baru = baru[:sisip].rstrip() + "\n" + TOMBOL + "\n" + baru[sisip:]
        aksi.append("tombol")

    # B. skema FAQ dari bagian yang sudah ada
    if "FAQPage" not in baru:
        pasangan = ambil_pasangan_faq(baru)
        if len(pasangan) >= 3:
            baru = baru.rstrip() + buat_skema(pasangan)
            aksi.append(f"skema FAQ ({len(pasangan)} pasangan)")

    if aksi:
        rencana.append({"id": p["id"], "slug": p["slug"], "raw": raw, "baru": baru, "aksi": aksi})

dari = {"tombol": 0, "faq": 0}
for r in rencana:
    if "tombol" in r["aksi"]:
        dari["tombol"] += 1
    if any(a.startswith("skema") for a in r["aksi"]):
        dari["faq"] += 1
print(f"\nrencana: {len(rencana)} artikel | tombol: {dari['tombol']} | skema FAQ: {dari['faq']}")
for r in rencana[:20]:
    print(f"   #{r['id']:>5} /{r['slug'][:44]:<46} {' + '.join(r['aksi'])}")

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

ok = 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"]})
    st, 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 = len(raw2) >= len(r["raw"]) and (("wa.me" in raw2) or ("tombol" not in r["aksi"]))
    ok += 1 if bagus else 0
    print(f"   #{r['id']} {'✅' if bagus else '⚠️'} | {len(r['raw'])} → {len(raw2)} | "
          f"WA: {'ya' if 'wa.me' in raw2 else 'tidak'} | FAQPage: {'ya' if 'FAQPage' in raw2 else 'tidak'}")
print(f"\nselesai: {ok}/{len(rencana)}")
