#!/usr/bin/env python3
"""DAS: verifikasi apakah artikel benar-benar TANPA meta Yoast, atau hanya tidak terbaca lewat REST."""
import base64, html, json, re, urllib.request, urllib.error, importlib.util

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"}


def rpc(method, params=()):
    from xml.sax.saxutils import escape

    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=150) as x:
            return x.read().decode("utf-8", "replace")
    except Exception as e:
        return f"ERR {str(e)[:80]}"


# uji 6 artikel: 3 dari daftar "nol klik", 3 dari daftar teratas
UJI = [None, None, None, None, None, None]
data = json.load(open(f"{WS}/drafts/das_audit_artikel_20260929.json"))
pilih = [a for a in data if a["imp"] >= 66 and a["klik"] == 0][:3] + \
        [a for a in sorted(data, key=lambda x: -x["klik"])[:3]]
for a in pilih:
    isi = rpc("wp.getPost", [1, USER, PASS, a["id"]])
    nilai = {}
    for kunci in ("_yoast_wpseo_focuskw", "_yoast_wpseo_title", "_yoast_wpseo_metadesc"):
        mm = re.search(r"<member><name>key</name><value><string>" + re.escape(kunci) +
                       r"</string></value></member>\s*<member><name>value</name><value><string>(.*?)</string>", isi, re.S)
        nilai[kunci] = html.unescape(mm.group(1)) if mm else None
    fault = re.search(r"<name>faultString</name><value><string>(.*?)</string>", isi, re.S)
    print(f"\n   #{a['id']} imp {a['imp']} klik {a['klik']} — {a['url'][:54]}")
    if fault:
        print(f"      ⚠️ XML-RPC: {fault.group(1)[:70]}")
    for k, v in nilai.items():
        print(f"      {k:<24} {(str(len(v)) + ' char') if v else '(kosong)'} {str(v)[:70] if v else ''}")
