#!/usr/bin/env python3
"""TSLaw: lengkapi meta Yoast halaman lewat XML-RPC (REST tidak mengekspos kuncinya).
Halaman: /practice-areas/, /hubungi/, /artikel/. BERANDA (#833) DILEWATI — dikerjakan Bos sendiri."""
import base64, json, re, time, urllib.request, urllib.error

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

RENCANA = [
    {"id": 12, "url": "/practice-areas/", "fokus": "layanan hukum surabaya",
     "judul": "Layanan Hukum Tito Suprianto Law Firm Surabaya",
     "meta": "Layanan hukum kami: sengketa tanah, kontrak bisnis, merek dagang, hukum keluarga, dan pendampingan perusahaan. Konsultasi dengan advokat Surabaya."},
    {"id": 10, "url": "/hubungi/", "fokus": "konsultasi hukum surabaya",
     "judul": "Hubungi Kami | Konsultasi Hukum Surabaya - Tito Suprianto",
     "meta": "Hubungi kantor advokat Tito Suprianto Law Firm di Surabaya. Kirim pertanyaan hukum Anda atau jadwalkan konsultasi bersama tim kami."},
    {"id": 2798, "url": "/artikel/", "fokus": "artikel hukum",
     "judul": "Artikel Hukum dan Panduan Praktis | Tito Suprianto Law Firm",
     "meta": "Kumpulan artikel hukum: kontrak bisnis, sengketa tanah, merek dagang, sampai hukum keluarga. Ditulis tim advokat Tito Suprianto Law Firm Surabaya."},
]


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>{k}</name>{val(x)}</member>" for k, x in v.items()) + "</struct></value>"
    return f"<value><string>{str(v)}</string></value>"


def rpc(method, params=()):
    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=120) 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")[:300]
        except Exception:
            time.sleep(4)
    return 0, "gagal"


def head(url):
    r = urllib.request.Request(f"https://{DOM}/wp-json/yoast/v1/get_head?url={url}",
                               headers={"User-Agent": "Mozilla/5.0"})
    with urllib.request.urlopen(r, timeout=90) as x:
        d = json.loads(x.read())
    j = d.get("json") or {}
    return j.get("title"), j.get("description")


print("=== MENULISMETA (XML-RPC) ===")
for r in RENCANA:
    cf = [{"key": "_yoast_wpseo_title", "value": r["judul"]},
          {"key": "_yoast_wpseo_metadesc", "value": r["meta"]},
          {"key": "_yoast_wpseo_focuskw", "value": r["fokus"]}]
    st, isi = rpc("wp.editPost", [1, USER, PASS, r["id"], {"custom_fields": cf}])
    sukses = "<boolean>1</boolean>" in isi
    print(f"  #{r['id']} {r['url']:<18} HTTP {st} | tersimpan: {'✅' if sukses else '❌ ' + re.sub(chr(10), ' ', isi)[:120]}")

print("\n=== VERIFIKASI (Yoast get_head) ===")
for r in RENCANA + [{"id": 834, "url": "/tentang/"}]:
    try:
        t, d = head(f"https://www.tslaw.id{r['url']}")
        print(f"  {r['url']:<18} judul: {str(t)[:58]:<60} meta: {len(d or '')} char")
    except Exception as e:
        print(f"  {r['url']:<18} gagal: {str(e)[:60]}")

print("\n=== CEK BERANDA (tidak disentuh) ===")
t, d = head("https://www.tslaw.id/")
print(f"  judul: {t}")
print(f"  meta : {len(d or '')} char")
