#!/usr/bin/env python3
"""FAQPage schema untuk 7 artikel query uang LEIT + FAQ visible untuk yang belum punya.
Dry run (default): tampilkan Q&A yang akan dipakai. --apply untuk POST."""
import base64, html, json, re, sys, urllib.request

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

# FAQ untuk artikel yang belum punya blok FAQ di konten
FAQ_BARU = {
    3825: [
        ("Berapa biaya kursus bahasa Inggris di LEIT Surabaya?",
         "Mulai Rp620.000 per bulan, salah satu yang paling terjangkau di Surabaya, sudah termasuk kurikulum CEFR internasional dan metode leadership-based learning."),
        ("Apakah ada biaya pendaftaran tambahan?",
         "Rincian biaya pendaftaran dan SPP bisa ditanyakan langsung ke admin LEIT lewat WhatsApp di 0811-331-700 (Surabaya Timur) atau 0811-396-488 (Surabaya Barat)."),
        ("Program apa saja yang tersedia dengan biaya tersebut?",
         "Ada program untuk usia 3 tahun hingga profesional: playgroup, kids, teens, dewasa, hingga kelas conversation dan persiapan karier."),
        ("Apakah bisa trial class dulu sebelum daftar?",
         "Bisa. LEIT menyediakan trial class gratis supaya Anda bisa merasakan metodenya sebelum memutuskan mendaftar."),
    ],
    3827: [
        ("Kursus bahasa Inggris mana yang paling terjangkau di Surabaya?",
         "LEIT Surabaya mulai Rp620.000 per bulan dengan kurikulum CEFR dan leadership-based learning, termasuk kelas tatap muka di dua lokasi."),
        ("Apa yang membedakan kursus murah dan kursus berkualitas?",
         "Kualitas terlihat dari kurikulum yang terstandarisasi (CEFR), kompetensi pengajar, ukuran kelas, dan konsistensi jadwal — bukan dari besarnya biaya."),
        ("Bagaimana cara memilih kursus yang sesuai kebutuhan?",
         "Tentukan dulu tujuan (anak, karier, atau percakapan harian), lalu bandingkan kurikulum, jarak dari rumah, dan fleksibilitas jadwal."),
        ("Apakah kursus terjangkau tetap bisa dapat sertifikat?",
         "Bisa. Program LEIT mengikuti kerangka CEFR sehingga progres kemampuan bisa diukur dan dilaporkan secara berkala."),
    ],
    3903: [
        ("Tempat les bahasa Inggris mana yang paling dekat di Surabaya?",
         "LEIT punya dua lokasi: Pakuwon Town Square (Surabaya Timur, dekat Pakuwon City Mall) dan Waterplace Residence (Surabaya Barat, seberang Pakuwon Mall)."),
        ("Berapa biaya les di tempat-tempat tersebut?",
         "LEIT mulai Rp620.000 per bulan untuk semua usia; biaya tempat lain bervariasi tergantung program dan jumlah pertemuan."),
        ("Apa yang perlu dicek sebelum memilih tempat les?",
         "Jarak dari rumah, jadwal yang konsisten, kurikulum yang jelas (CEFR), ukuran kelas, dan apakah ada trial class gratis."),
        ("Apakah ada kelas untuk anak-anak?",
         "Ada. LEIT menerima siswa mulai usia 3 tahun dengan metode bermain, lagu, dan aktivitas yang menyenangkan."),
    ],
}

PID = [3928, 3925, 3904, 3902, 3825, 3827, 3903]


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)
    with urllib.request.urlopen(r, timeout=240) as x:
        return json.loads(x.read())


def parse_faq(raw):
    """Ambil pasangan Q/A dari dua pola: <h2>Q: ...</h2>+<p>A</p>, atau <p><strong>N. Q?</strong></p>+<p>A</p>."""
    pasangan = []
    for m in re.finditer(r"<h2[^>]*>\s*(?:Q[:.]?\s*)(.*?)</h2>(.*?)(?=<h2|$)", raw, re.S | re.I):
        q = html.unescape(re.sub(r"<[^>]+>", " ", m.group(1))).strip(" :")
        body = m.group(2)
        ans = re.search(r"<p>(.*?)</p>", body, re.S)
        if not ans:
            continue
        a = html.unescape(re.sub(r"<[^>]+>", " ", ans.group(1)))
        a = re.sub(r"^\s*A\s*[:.]?\s*", "", a).strip()
        a = re.sub(r"\s+", " ", a)
        if q and a:
            pasangan.append((q, a))
    if pasangan:
        return pasangan
    # pola kedua: <p><strong>1. Pertanyaan?</strong></p><p>Jawaban…</p>
    pat = re.compile(r"<p>\s*<strong>\s*\d+[.)]?\s*(.{8,160}?\?)\s*</strong>\s*</p>\s*<p>(.*?)</p>", re.S)
    for m in pat.finditer(raw):
        q = html.unescape(re.sub(r"<[^>]+>", " ", m.group(1))).strip()
        a = html.unescape(re.sub(r"<[^>]+>", " ", m.group(2))).strip()
        a = re.sub(r"\s+", " ", a)
        if q and a:
            pasangan.append((q, a))
    return pasangan


hasil = {}
for pid in PID:
    raw = api(f"/wp-json/wp/v2/posts/{pid}?context=edit&_fields=content")["content"]["raw"]
    raw = raw.replace('<script type="application/ld+json">{"@context":"https://schema.org","@type":"FAQPage","mainEntity":[{"@type":"Question","name":"Uji coba skema LEIT?","acceptedAnswer":{"@type":"Answer","text":"Ini uji coba, akan dihapus."}}]}</script>', "")
    qa = parse_faq(raw)
    sumber = "dari konten" if qa else "BARU (akan ditambah ke konten)"
    if not qa:
        qa = FAQ_BARU.get(pid)
    if not qa:
        print(f"\n#{pid} — FAQ tidak terbaca & belum ada draf → DILEWATI (perlu dicek manual)")
        continue
    # jangan masukkan klaim IELTS/TOEFL ke schema — Bos: LEIT tidak buka kelas persiapan IELTS
    qa = [(q, a) for q, a in qa if not re.search(r"\bIELTS\b|\bTOEFL\b", q + " " + a, re.I)]
    hasil[pid] = qa
    print(f"\n#{pid} — {len(qa)} Q&A ({sumber})")
    for q, a in qa:
        print(f"   Q: {q[:80]}")
        print(f"   A: {a[:80]}")

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

ok = gagal = 0
for pid, qa in hasil.items():
    raw = api(f"/wp-json/wp/v2/posts/{pid}?context=edit&_fields=content")["content"]["raw"]
    raw = raw.replace('<script type="application/ld+json">{"@context":"https://schema.org","@type":"FAQPage","mainEntity":[{"@type":"Question","name":"Uji coba skema LEIT?","acceptedAnswer":{"@type":"Answer","text":"Ini uji coba, akan dihapus."}}]}</script>', "")
    raw = re.sub(r'\n?<script type="application/ld\+json">\{"@context":"https://schema\.org","@type":"FAQPage".*?</script>', "", raw, flags=re.S)
    if not parse_faq(raw):
        blok = "\n<h2>FAQ — Pertanyaan yang Sering Ditanyakan</h2>\n" + "\n".join(
            f"<h2>Q: {q}</h2>\n<p><strong>A:</strong> {a}</p>" for q, a in qa) + "\n"
        m = re.search(r"\n<h2>\s*Kesimpulan", raw, re.I)
        raw = (raw[:m.start()] + blok + raw[m.start():]) if m else (raw.rstrip() + blok)
    schema = {"@context": "https://schema.org", "@type": "FAQPage",
              "mainEntity": [{"@type": "Question", "name": q,
                              "acceptedAnswer": {"@type": "Answer", "text": a}} for q, a in qa]}
    baru = raw.rstrip() + "\n" + '<script type="application/ld+json">' + json.dumps(schema, ensure_ascii=False) + "</script>"
    res = api(f"/wp-json/wp/v2/posts/{pid}", {"content": baru}, "POST")
    body = json.dumps(res) if isinstance(res, dict) else ""
    cek = "FAQPage" in body
    print(f"  #{pid} POST | FAQPage tersimpan: {'Y' if cek else 'N'}")
    ok += 1 if cek else 0
    gagal += 0 if cek else 1
print(f"\nselesai: {ok} ok | {gagal} gagal")
