#!/usr/bin/env python3
"""TSLaw: perbarui keyphrase beranda dengan menyertakan ID baris meta (bukan menambah baris baru)."""
import base64, re, sys, time, urllib.request, urllib.error
from xml.sax.saxutils import escape

DOM = "tslaw.id"
USER, PASS = "bambangbot", "EFKm EYGx VQCP Y9go ncPr uM2Y"
AUTH = base64.b64encode(f"{USER}:{PASS}".encode()).decode()
PID = 833
BARU = "law firm surabaya"


def rpc(method, params=()):
    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):
            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")
    for _ in range(3):
        try:
            with urllib.request.urlopen(r, timeout=150) 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")[:250]
        except Exception:
            time.sleep(4)
    return 0, "gagal"


st, isi = rpc("wp.getPost", [1, USER, PASS, PID])
print("=== semua baris meta Yoast pada beranda ===")
for m in re.finditer(r"<struct>\s*<member><name>id</name><value><string>(\d+)</string></value></member>\s*"
                     r"<member><name>key</name><value><string>([^<]+)</string></value></member>\s*"
                     r"<member><name>value</name><value><string>(.*?)</string>", isi, re.S):
    mid, key, val = m.groups()
    if "yoast" in key.lower():
        print(f"   id {mid:<8} {key:<34} {val[:60]}")

baris = [(m.group(1), m.group(2)) for m in re.finditer(
    r"<member><name>id</name><value><string>(\d+)</string></value></member>\s*"
    r"<member><name>key</name><value><string>_yoast_wpseo_focuskw</string></value></member>\s*"
    r"<member><name>value</name><value><string>(.*?)</string>", isi, re.S)]
print(f"\n=== baris _yoast_wpseo_focuskw: {len(baris)} ===")
for mid, val in baris:
    print(f"   meta_id {mid}: {val}")

if "--apply" not in sys.argv:
    print("\n(dry run — pakai --apply untuk memperbarui baris pertama)")
    sys.exit(0)

if not baris:
    print("\n   tidak ada baris focuskw — memakai jalur tambah biasa")
    st, isi2 = rpc("wp.editPost", [1, USER, PASS, PID, {"custom_fields": [{"key": "_yoast_wpseo_focuskw", "value": BARU}]}])
    print(f"   HTTP {st} | {'tersimpan' if '<boolean>1</boolean>' in isi2 else isi2[:150]}")
else:
    print(f"\n=== perbarui {len(baris)} baris focuskw → '{BARU}' ===")
    for mid, lama in baris:
        st, isi2 = rpc("wp.editPost", [1, USER, PASS, PID,
                                       {"custom_fields": [{"id": int(mid), "key": "_yoast_wpseo_focuskw", "value": BARU}]}])
        ok = "<boolean>1</boolean>" in isi2
        print(f"   meta_id {mid} ('{lama[:38]}') → HTTP {st} | {'tersimpan' if ok else '❌ ' + isi2[:120]}")

time.sleep(2)
st, cek = rpc("wp.getPost", [1, USER, PASS, PID])
m = re.search(r"<member><name>key</name><value><string>_yoast_wpseo_focuskw</string></value></member>\s*"
              r"<member><name>value</name><value><string>(.*?)</string>", cek, re.S)
print(f"\n=== verifikasi: keyphrase beranda sekarang = {m.group(1) if m else '?'} ===")
