#!/usr/bin/env python3
"""DMark: uji apakah penulisan meta Yoast benar-benar tersimpan — diuji pada SATU artikel."""
import base64, html, json, 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_dmark", f"{WS}/cfg_dmark.py")
m = importlib.util.module_from_spec(spec); spec.loader.exec_module(m)
DOM, USER, PASS = m.CFG.get("domain", "www.dmark.id"), m.CFG["user"], m.CFG["pass"]
AUTH = base64.b64encode(f"{USER}:{PASS}".encode()).decode()
UA = {"User-Agent": "Mozilla/5.0"}
PID = 2322          # artikel "Teknik Copywriting untuk Bisnis"
JUDUL = "Teknik Copywriting untuk Bisnis: Panduan Praktis (UJI)"
DESK = "Uji penulisan meta melalui XML-RPC."


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)[:110]}"


def ambil(u):
    try:
        r = urllib.request.urlopen(urllib.request.Request(u, headers=UA), timeout=90)
        return r.read().decode("utf-8", "replace")
    except Exception as e:
        return f"GAGAL {str(e)[:70]}"


print("=== 1. keadaan artikel sebelum uji ===")
h = ambil(f"https://{DOM}/7-strategi-retensi-pelanggan-dengan-email-marketing-otomatis/")
t = re.search(r"<title[^>]*>(.*?)</title>", h, re.S)
de = re.search(r'<meta name="description" content="([^"]*)"', h, re.I)
print("   judul:", html.unescape(t.group(1))[:90] if t else "-")
print("   deskripsi:", de.group(1)[:100] if de else "(tidak ada)")

print("\n=== 2. tulis meta ke artikel #2322 (uji) ===")
bal = rpc("wp.editPost", [1, USER, PASS, PID, {"custom_fields": [
    {"key": "_yoast_wpseo_title", "value": JUDUL},
    {"key": "_yoast_wpseo_metadesc", "value": DESK}]}])
fault = re.search(r"<name>faultString</name><value><string>(.*?)</string>", bal, re.S)
print("   balasan:", ("GAGAL — " + fault.group(1)[:100]) if fault else "sukses (boolean)")

print("\n=== 3. tunggu 5 detik, lalu baca halaman artikel itu di live ===")
time.sleep(5)
for suf in ("", "?nowprocket=1"):
    h2 = ambil(f"https://{DOM}/7-strategi-retensi-pelanggan-dengan-email-marketing-otomatis/{suf}")
    if h2.startswith("GAGAL"):
        print(f"   {suf or '(cache)'}: {h2}")
        continue
    t2 = re.search(r"<title[^>]*>(.*?)</title>", h2, re.S)
    de2 = re.search(r'<meta name="description" content="([^"]*)"', h2, re.I)
    print(f"   {suf or '(cache)'}: judul={html.unescape(t2.group(1))[:70] if t2 else '-'} | desc={de2.group(1)[:60] if de2 else '(tidak ada)'}")
