#!/usr/bin/env python3
"""Meta Yoast #2928: metadesc masih menyebut 'sesuai UU ITE' yang tidak lagi berlaku.
Tulis custom_fields lewat XML-RPC (REST tidak mengekspos kunci Yoast), isi TIDAK disentuh."""
import base64, json, re, sys, urllib.request, urllib.error

DOM = "tslaw.id"
USER, PASS = "bambangbot", "EFKm EYGx VQCP Y9go ncPr uM2Y"
AUTH = base64.b64encode(f"{USER}:{PASS}".encode()).decode()
PID = 2928
DESC = ("Nama baik dicemarkan di media sosial? Ini 7 langkah hukum melaporkannya, "
        "dari mengamankan bukti sampai lapor polisi, dengan dasar Pasal 433 KUHP baru.")
APPLY = "--apply" in sys.argv


def val(v):
    if isinstance(v, bool):
        return f"<value><boolean>{1 if v else 0}</boolean></value>"
    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>{k}</name>{val(x)}</member>" for k, x in v.items()) + "</struct></value>"
    return f"<value><string>{v}</string></value>"


def rpc(method, params=()):
    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=120) as x:
            return x.status, x.read().decode("utf-8", "replace")
    except urllib.error.HTTPError as e:
        return e.code, e.read().decode("utf-8", "replace")[:400]
    except Exception as e:
        return 0, str(e)[:200]


print("panjang metadesc baru:", len(DESC))
assert len(DESC) <= 160, "metadesc terlalu panjang"

st, isi = rpc("wp.getPost", [1, USER, PASS, PID])
if "faultCode" in isi:
    print("gagal baca:", re.sub(r"\s+", " ", isi)[:300]); sys.exit(1)
print("HTTP", st, "| post terbaca")
for k, v in re.findall(r"<member><name>([^<]+)</name><value><string>([^<]*)</string>", isi):
    if k.startswith("_yoast"):
        print(f"  {k:<32} {v[:110]}")

if not APPLY:
    print("\nDRY RUN (tambah --apply untuk menulis).")
    sys.exit(0)

CF = [{"key": "_yoast_wpseo_metadesc", "value": DESC}]
st, isi = rpc("wp.editPost", [1, USER, PASS, PID, {"custom_fields": CF}])
print("\neditPost ->", st, "|", re.sub(r"\s+", " ", isi)[:120])

# verifikasi: meta lewat REST context=edit, judul/slug/isi tidak boleh berubah
r = urllib.request.Request(f"https://{DOM}/wp-json/wp/v2/posts/{PID}?context=edit",
                           headers={"Authorization": f"Basic {AUTH}", "User-Agent": "Mozilla/5.0"})
p = json.loads(urllib.request.urlopen(r, timeout=120).read())
m = p.get("meta") or {}
print("metadesc sekarang:", m.get("_yoast_wpseo_metadesc"))
print("judul:", p["title"]["raw"], "| slug:", p["slug"])
print("isi masih 1868 kata:", len(re.findall(r"[A-Za-z0-9][A-Za-z0-9'\-]*",
      re.sub(r"<[^>]+>", " ", re.sub(r"<script[^>]*>.*?</script>", " ", p["content"]["raw"], flags=re.S)))))
assert m.get("_yoast_wpseo_metadesc") == DESC, "metadesc tidak tersimpan"

r = urllib.request.Request(f"https://{DOM}/wp-json/yoast/v1/get_head?url=https://www.tslaw.id/{p['slug']}/",
                           headers={"User-Agent": "Mozilla/5.0"})
y = json.loads(urllib.request.urlopen(r, timeout=90).read())
print("yoast head desc:", (y.get("json") or {}).get("description"))
