#!/usr/bin/env python3
"""DAS: telusuri kenapa penulisan meta Yoast ditolak di sebagian artikel — coba tiga jalur."""
import base64, html, json, re, time, 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_das", f"{WS}/cfg_das.py")
m = importlib.util.module_from_spec(spec); spec.loader.exec_module(m)
CFG = m.CFG
DOM, USER, PASS = CFG["domain"], CFG["user"], CFG["pass"]
AUTH = base64.b64encode(f"{USER}:{PASS}".encode()).decode()
UA = {"User-Agent": "Mozilla/5.0"}
PID = 6304
KANONIK = "https://dasindonesia.com/bengkel-spesialis-alphard-surabaya/"


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=180) as x:
            return x.read().decode("utf-8", "replace")
    except urllib.error.HTTPError as e:
        return f"HTTP {e.code}: {e.read().decode('utf-8', 'replace')[:200]}"
    except Exception as e:
        return f"ERR {str(e)[:100]}"


def baca(pid):
    isi = rpc("wp.getPost", [1, USER, PASS, pid])
    out = {}
    for mm in re.finditer(r"<member><name>key</name><value><string>(_[^<]+)</string></value></member>\s*"
                          r"<member><name>value</name><value><string>(.*?)</string>", isi, re.S):
        out.setdefault(mm.group(1), html.unescape(mm.group(2)))
    fault = re.search(r"<name>faultString</name><value><string>(.*?)</string>", isi, re.S)
    return out, (fault.group(1) if fault else None)


print("=== A. wp.editPost dengan custom_fields ===")
bal = rpc("wp.editPost", [1, USER, PASS, PID, {"custom_fields": [
    {"key": "_yoast_wpseo_canonical", "value": KANONIK},
    {"key": "_yoast_wpseo_meta-robots-noindex", "value": "1"}]}])
print("   balasan:", re.sub(r"\s+", " ", bal)[:300])

print("\n=== B. jalur REST: tulis meta lewat /wp-json ===")
try:
    r = urllib.request.Request(f"https://{DOM}/wp-json/wp/v2/posts/{PID}",
                               data=json.dumps({"meta": {"_yoast_wpseo_canonical": KANONIK,
                                                         "_yoast_wpseo_meta-robots-noindex": "1"}}).encode(),
                               headers={"Authorization": f"Basic {AUTH}", "Content-Type": "application/json", **UA},
                               method="POST")
    with urllib.request.urlopen(r, timeout=150) as x:
        d = json.loads(x.read())
        print("   status:", x.status, "| meta tersimpan:", d.get("meta"))
except urllib.error.HTTPError as e:
    print("   HTTP", e.code, e.read().decode()[:200])
except Exception as e:
    print("   gagal:", str(e)[:120])

print("\n=== C. keadaan setelah percobaan ===")
md, fault = baca(PID)
print("   fault:", fault)
for k in ("_yoast_wpseo_canonical", "_yoast_wpseo_meta-robots-noindex"):
    print(f"   {k:<34} {md.get(k) or '(kosong)'}")
print(f"   jumlah field meta: {len(md)}")

print("\n=== D. apakah wp.getPost mengembalikan semua custom field? ===")
isi = rpc("wp.getPost", [1, USER, PASS, PID])
print("   jumlah <member> di custom_fields:",
      len(re.findall(r"<member><name>key</name>", isi)))
kunci = re.findall(r"<member><name>key</name><value><string>([^<]+)</string>", isi)
print("   kunci yang terlihat:", sorted(set(kunci))[:20])
