#!/usr/bin/env python3
"""TSC: cek penulis halaman 409 (penyebab pesan 'Invalid author ID') dan kesiapan jalur manual."""
import base64, json, re, urllib.request, urllib.error, importlib.util
from xml.sax.saxutils import escape

WS = "/home/mantapman/.hermes/profiles/atun/workspace"
spec = importlib.util.spec_from_file_location("cfg_tsc", f"{WS}/cfg_tsc.py")
mod = importlib.util.module_from_spec(spec); spec.loader.exec_module(mod)
CFG = mod.CFG
DOM, USER, PASS = CFG["domain"], CFG["user"], CFG["pass"]
AUTH = base64.b64encode(f"{USER}:{PASS}".encode()).decode()
UA = {"User-Agent": "Mozilla/5.0"}


def rest(p):
    r = urllib.request.Request(f"https://{DOM}{p}", headers={"Authorization": f"Basic {AUTH}", **UA})
    with urllib.request.urlopen(r, timeout=120) as x:
        return json.loads(x.read())


d = rest("/wp-json/wp/v2/pages/409?context=edit&_fields=id,author,slug,title")
print("=== halaman 409 ===")
print(f"   penulis (author id): {d.get('author')} | slug: {d.get('slug')}")
print(f"   judul halaman      : {d.get('title', {}).get('raw') or d.get('title', {}).get('rendered')}")

print("\n=== daftar user di situs ===")
try:
    users = rest("/wp-json/wp/v2/users?per_page=100&context=edit&_fields=id,name,slug,roles")
    for u in users:
        tanda = "  ← penulis halaman beranda" if u["id"] == d.get("author") else ""
        print(f"   id {u['id']:>3} {u['name'][:30]:<32} {u.get('roles')}{tanda}")
except urllib.error.HTTPError as e:
    print("   gagal:", e.code)

print("\n=== uji XML-RPC pada halaman lain (apakah tulis ditolak di semua halaman?) ===")


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")
    with urllib.request.urlopen(r, timeout=120) as x:
        return x.read().decode("utf-8", "replace")


for pid in (1585, 6622, 1531):
    isi = rpc("wp.editPost", [1, USER, PASS, pid, {"custom_fields": [{"key": "_uji_hermes_meta", "value": "1"}]}])
    pesan = re.search(r"<name>faultString</name><value><string>(.*?)</string>", isi, re.S)
    print(f"   halaman #{pid}: {'GAGAL — ' + pesan.group(1)[:60] if pesan else 'berhasil ditulis'}")
