#!/usr/bin/env python3
"""TSLaw: baca keyphrase/keyword Yoast yang terpasang sekarang (via XML-RPC, hanya baca)."""
import base64, re, urllib.request, urllib.error
from xml.sax.saxutils import escape

DOM = "tslaw.id"
USER, PASS = "bambangbot", "EFKm EYGx VQCP Y9go ncPr uM2Y"
AUTH = base64.b64encode(f"{USER}:{PASS}".encode()).decode()


def rpc(method, params=()):
    def val(v):
        if isinstance(v, int):
            return f"<value><int>{v}</int></value>"
        if isinstance(v, list):
            return "<value><array><data>" + "".join(val(x) for x in v) + "</data></array></value>"
        if isinstance(v, dict):
            return "<value><struct>" + "".join(f"<member><name>{escape(str(k))}</name>{val(x)}</member>"
                                               for k, x in v.items()) + "</struct></value>"
        return f"<value><string>{escape(str(v))}</string></value>"
    body = ("<?xml version=\"1.0\"?><methodCall><methodName>" + method + "</methodName><params>" +
            "".join(f"<param>{val(p)}</param>" for p in params) + "</params></methodCall>").encode()
    r = urllib.request.Request(f"https://www.{DOM}/xmlrpc.php", data=body,
                               headers={"Content-Type": "text/xml", "User-Agent": "Mozilla/5.0",
                                        "Authorization": f"Basic {AUTH}"}, method="POST")
    try:
        with urllib.request.urlopen(r, timeout=150) as x:
            return x.read().decode("utf-8", "replace")
    except urllib.error.HTTPError as e:
        return e.read().decode("utf-8", "replace")[:200]
    except Exception as e:
        return f"ERR {str(e)[:80]}"


def field(isi, nama):
    """Ambil nilai custom field dari respons wp.getPost."""
    pola = r"<member><name>(?:custom_fields</name>.*?</member>)?\s*<member><name>" + re.escape(nama) + \
           r"</name><value><(?:string|int|boolean)(?:[^>]*)>(?:<!\[CDATA\[)?([^<\]]*)"
    m = re.search(pola, isi, re.S)
    return m.group(1) if m else None


print("=== keyphrase & meta Yoast per halaman (kondisi sekarang) ===")
for pid, nama in ((833, "Beranda"), (834, "Tentang"), (12, "Layanan"), (10, "Hubungi"), (2798, "Artikel")):
    isi = rpc("wp.getPost", [1, USER, PASS, pid, ["custom_fields"]])
    nilai = {}
    for kunci in ("_yoast_wpseo_focuskw", "_yoast_wpseo_title", "_yoast_wpseo_metadesc"):
        m = re.search(r"<name>" + re.escape(kunci) + r"</name><value><string>(.*?)</string>", isi, re.S)
        nilai[kunci] = m.group(1) if m else None
    print(f"\n  #{pid} {nama}")
    for k, v in nilai.items():
        if v:
            tanda = " ⚠️ ada entity" if "amp;" in v or "&#" in v else ""
            print(f"     {k:<26} {v[:90]}{tanda}")
        else:
            print(f"     {k:<26} (kosong / tidak terbaca)")
    if "faultCode" in isi:
        print("     ⚠️ fault:", re.sub(r"\s+", " ", isi)[:160])
