#!/usr/bin/env python3
"""TSLaw: tulis meta Yoast lewat XML-RPC (REST tidak mengekspos kuncinya).
Fungsi: wp.editPost dengan custom_fields."""
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()


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):
        isi = "".join(val(x) for x in v)
        return f"<value><array><data>{isi}</data></array></value>"
    if isinstance(v, dict):
        members = "".join(f"<member><name>{k}</name>{val(x)}</member>" for k, x in v.items())
        return f"<value><struct>{members}</struct></value>"
    return f"<value><string>{str(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("=== 1. login ===")
st, isi = rpc("wp.getProfile", [1, USER, PASS])
if "faultCode" in isi:
    print("   gagal:", re.sub(r"\s+", " ", isi)[:250])
    sys.exit(1)
nama = re.search(r"<member><name>display_name</name><value><string>([^<]*)</string>", isi)
print(f"   HTTP {st} | login berhasil sebagai: {nama.group(1) if nama else '?'}")

print("\n=== 2. baca custom field halaman 834 ===")
st, isi = rpc("wp.getPost", [1, USER, PASS, 834])
if "faultCode" in isi:
    print("   gagal:", re.sub(r"\s+", " ", isi)[:250])
else:
    fields = re.findall(r"<member><name>([^<]+)</name><value><string>([^<]*)</string>", isi)
    judul = re.search(r"<name>post_title</name><value><string>([^<]*)</string>", isi)
    print("   judul:", judul.group(1) if judul else "?")
    print("   custom field terbaca:", len(fields))
    for k, v in fields[:12]:
        print(f"     {k:<34} {v[:50]}")

print("\n=== 3. tulis meta Yoast (uji pada /tentang/ #834) ===")
CF = [
    {"key": "_yoast_wpseo_title", "value": "Tentang Tito Suprianto Law Firm, Advokat Surabaya"},
    {"key": "_yoast_wpseo_metadesc", "value": "Profil Tito Suprianto Law Firm: kantor advokat dan konsultan hukum di Surabaya. Kenali tim, pengalaman, dan cara kami mendampingi klien."},
    {"key": "_yoast_wpseo_focuskw", "value": "tito suprianto law firm"},
]
st, isi = rpc("wp.editPost", [1, USER, PASS, 834, {"custom_fields": CF}])
print(f"   HTTP {st} | balasan: {re.sub(chr(10) + '|' + chr(9), ' ', isi)[:200]}")
print("   (true = tersimpan)")

print("\n=== 4. verifikasi lewat Yoast ===")
r = urllib.request.Request(f"https://{DOM}/wp-json/yoast/v1/get_head?url=https://www.tslaw.id/tentang/",
                           headers={"User-Agent": "Mozilla/5.0"})
with urllib.request.urlopen(r, timeout=90) as x:
    y = json.loads(x.read())
print("   judul:", (y.get("json") or {}).get("title"))
print("   desc :", (y.get("json") or {}).get("description"))
