#!/usr/bin/env python3
"""TSLaw: beranda + halaman hubungi — ubah HANYA teks di dalam atribut blok (struktur & gaya tidak disentuh).
Jalankan --apply untuk menyimpan."""
import base64, json, re, sys, 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()

# ── perubahan: (id halaman, keterangan, teks lama, teks baru, jumlah yang diharapkan)
UBAH = [
    (833, "H1 beranda → kata kunci lokal",
     '"tagName":"h1","text":"Tito Suprianto Law Firm"',
     '"tagName":"h1","text":"Law Firm & Konsultan Hukum Surabaya"', 1),
    (833, "H2 kedua (duplikat nama) → dijelaskan",
     '"tagName":"h2","text":"Tito Suprianto Law Firm"',
     '"tagName":"h2","text":"Tentang Tito Suprianto Law Firm"', 1),
    (10, "lorem ipsum di /hubungi/ → kalimat asli",
     '"text":"Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Donec velit neque."',
     '"text":"Sampaikan persoalan hukum Anda, kami akan menilai langkah awal yang paling tepat."', 1),
    (10, "nomor telepon palsu → nomor asli",
     '"text":"+1 1184 4457 44\\u003cbr\\u003e+1 4487 4477 11"',
     '"text":"+62 819 0922 2026"', 1),
]

SCHEMA = {
    "@context": "https://schema.org",
    "@type": "Attorney",
    "name": "Tito Suprianto Law Firm",
    "alternateName": "TS Law Firm",
    "url": "https://www.tslaw.id/",
    "telephone": "+6281909222026",
    "email": "info@tslaw.id",
    "address": {"@type": "PostalAddress", "streetAddress": "Raya Tidar Mas Square",
                "addressLocality": "Surabaya", "addressRegion": "Jawa Timur", "addressCountry": "ID"},
    "areaServed": [{"@type": "City", "name": "Surabaya"}, {"@type": "State", "name": "Jawa Timur"}],
    "knowsLanguage": ["id", "en"],
    "serviceType": ["Hukum Bisnis", "Sengketa Tanah", "Merek Dagang", "Hukum Keluarga", "Legalitas Perusahaan"],
}


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>{k}</name>{val(x)}</member>" for k, x in v.items()) + "</struct></value>"
        return f"<value><string>{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")[:300]
        except Exception:
            time.sleep(4)
    return 0, "gagal"


def konten(pid):
    r = urllib.request.Request(f"https://{DOM}/wp-json/wp/v2/pages/{pid}?context=edit&_fields=content",
                               headers={"Authorization": f"Basic {AUTH}", "User-Agent": "Mozilla/5.0"})
    for _ in range(3):
        try:
            with urllib.request.urlopen(r, timeout=150) as x:
                return json.loads(x.read())["content"]["raw"]
        except Exception:
            time.sleep(4)
    return ""


halaman = {833: konten(833), 10: konten(10)}
print("=== RENCANA PERUBAHAN TEKS ===")
for pid, ket, lama, baru, jml in UBAH:
    n = halaman[pid].count(lama)
    tanda = "✅" if n == jml else f"❌ ditemukan {n}x (diharapkan {jml}x)"
    print(f"  #{pid} {ket}\n     {tanda}")
    print(f"     lama: {lama[:96]}")
    print(f"     baru: {baru[:96]}")

print("\n=== SKEMA LOKAL (ditambahkan di akhir beranda) ===")
print("  ", json.dumps(SCHEMA, ensure_ascii=False)[:220], "…")

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

print("\n=== MENYIMPAN ===")
for pid in (833, 10):
    baru = halaman[pid]
    for p, ket, lama, ganti, jml in UBAH:
        if p == pid:
            baru = baru.replace(lama, ganti)
    if pid == 833:
        blok = '<script type="application/ld+json">' + json.dumps(SCHEMA, ensure_ascii=False) + "</script>"
        if "LegalService" not in baru and '"@type": "Attorney"' not in baru:
            baru += "\n" + blok
    st, isi = rpc("wp.editPost", [1, USER, PASS, pid, {"post_content": baru}])
    print(f"  #{pid}: HTTP {st} | tersimpan: {'✅' if '<boolean>1</boolean>' in isi else '❌ ' + re.sub(chr(10), ' ', isi)[:150]}")

print("\n=== META BERANDA (judul & deskripsi) ===")
cf = [{"key": "_yoast_wpseo_title", "value": "Law Firm Surabaya | Tito Suprianto Law Firm"},
      {"key": "_yoast_wpseo_metadesc", "value": "Law firm Surabaya untuk sengketa tanah, kontrak bisnis, merek dagang, dan legalitas usaha. Konsultasi gratis bersama advokat Tito Suprianto Law Firm."},
      {"key": "_yoast_wpseo_focuskw", "value": "law firm surabaya"}]
st, isi = rpc("wp.editPost", [1, USER, PASS, 833, {"custom_fields": cf}])
print(f"  HTTP {st} | tersimpan: {'✅' if '<boolean>1</boolean>' in isi else '❌ ' + re.sub(chr(10), ' ', isi)[:150]}")
