#!/usr/bin/env python3
"""TSLaw: uji apakah meta _wp_old_slug bisa ditulis lewat XML-RPC (di artikel uji), untuk jalur redirect."""
import base64, html, re, time, urllib.request, importlib.util
from xml.sax.saxutils import escape

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, USER, PASS = "www.tslaw.id", m.CFG["user"], m.CFG["pass"]
AUTH = base64.b64encode(f"{USER}:{PASS}".encode()).decode()
UJI = 3559  # artikel pilar yang baru kita buat (aman untuk diuji)


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://{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 Exception as e:
        return f"ERR {str(e)[:100]}"


def baca_meta(pid):
    isi = rpc("wp.getPost", [1, USER, PASS, pid])
    f = re.findall(r"<member><name>key</name><value><string>(_[^<]+)</string></value></member>\s*"
                   r"<member><name>value</name><value><string>(.*?)</string>", isi, re.S)
    return {k: html.unescape(v) for k, v in f}, isi


print("=== A. tulis _wp_old_slug ke artikel #3559 lewat wp.editPost ===")
bal = rpc("wp.editPost", [1, USER, PASS, UJI, {"custom_fields": [{"key": "_wp_old_slug", "value": "uji-slug-lama"}]}])
fault = re.search(r"<name>faultString</name><value><string>(.*?)</string>", bal, re.S)
print("   balasan:", ("GAGAL — " + fault.group(1)[:90]) if fault else re.sub(r"\s+", " ", bal)[:100])
time.sleep(2)
md, _ = baca_meta(UJI)
print(f"   _wp_old_slug setelah tulis: {md.get('_wp_old_slug') or '(tidak tersimpan)'} | total meta: {len(md)}")

print("\n=== B. coba lewat wp.setPostMeta bila tersedia ===")
bal2 = rpc("wp.setPostMeta", [1, USER, PASS, UJI, "_wp_old_slug", "uji-slug-lama"])
print("   balasan:", re.sub(r"\s+", " ", bal2)[:200])
time.sleep(2)
md2, _ = baca_meta(UJI)
print(f"   _wp_old_slug sekarang: {md2.get('_wp_old_slug') or '(tidak tersimpan)'}")

print("\n=== C. bersihkan kalau tersimpan ===")
if md2.get("_wp_old_slug"):
    bal3 = rpc("wp.deletePostMeta", [1, USER, PASS, UJI, "_wp_old_slug"])
    print("   hapus:", re.sub(r"\s+", " ", bal3)[:120])
    md3, _ = baca_meta(UJI)
    print(f"   sisa: {md3.get('_wp_old_slug') or 'bersih ✅'}")
