#!/usr/bin/env python3
"""TSLaw: (1) verifikasi halaman pilar di live, (2) pasang pengalihan slug lama /practice-areas/ → /layanan/."""
import base64, html, json, re, sys, time, urllib.request, urllib.error, importlib.util
from xml.sax.saxutils import escape

WS = "/home/mantapman/.hermes/profiles/atun/workspace"
spec = importlib.util.spec_from_file_location("cfg_tslaw", f"{WS}/cfg_tslaw.py")
m = importlib.util.module_from_spec(spec); spec.loader.exec_module(m)
CFG = m.CFG
DOM, USER, PASS = "www.tslaw.id", CFG["user"], CFG["pass"]
AUTH = base64.b64encode(f"{USER}:{PASS}".encode()).decode()
UA = {"User-Agent": "Mozilla/5.0"}


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


print("=== 1. halaman pilar di live ===")
try:
    h = urllib.request.urlopen(urllib.request.Request("https://www.tslaw.id/law-firm-surabaya/", headers=UA), timeout=120).read().decode("utf-8", "replace")
    t = re.search(r"<title[^>]*>(.*?)</title>", h, re.S)
    de = re.search(r'<meta name="description" content="([^"]*)"', h)
    can = re.findall(r'<link rel="canonical" href="([^"]+)"', h)
    rob = re.findall(r"<meta name=.robots. content=.([^\"']+)", h)
    h1 = re.findall(r"<h1[^>]*>(.*?)</h1>", h, re.S)
    h2 = re.findall(r"<h2[^>]*>(.*?)</h2>", h, re.S)
    print(f"   <title>     : {html.unescape(t.group(1)).strip()[:100] if t else '-'}")
    print(f"   description : {html.unescape(de.group(1))[:140] if de else '(tidak ada)'}")
    print(f"   canonical   : {can}")
    print(f"   robots      : {rob}")
    print(f"   H1          : {[html.unescape(re.sub('<[^>]+>','',x)).strip()[:70] for x in h1[:2]]}")
    print(f"   jumlah H2   : {len(h2)}")
    print(f"   tombol WA   : {len(re.findall('wa.me', h))} | skema JSON-LD: {len(re.findall('application/ld+json', h))}")
    print(f"   FAQPage ada : {'FAQPage' in h} | LegalService ada: {'LegalService' in h}")
except Exception as e:
    print("   gagal:", str(e)[:100])

print("\n=== 2. pengalihan /practice-areas/ → /layanan/ ===")
isi = rpc("wp.getPost", [1, USER, PASS, 12])
if "faultString" in isi:
    print("   gagal baca halaman #12:", re.search(r"<name>faultString</name><value><string>(.*?)</string>", isi, re.S).group(1)[:100])
    sys.exit(0)

fields = re.findall(r"<member><name>key</name><value><string>(_[^<]+)</string></value></member>\s*"
                    r"<member><name>value</name><value><string>(.*?)</string>", isi, re.S)
sekarang = {k: html.unescape(v) for k, v in fields}
print(f"   meta halaman #12 saat ini: {len(sekarang)} kunci | sudah ada _wp_old_slug: {'_wp_old_slug' in sekarang}")

if "--pasang" in sys.argv:
    baru = dict(sekarang)
    lama = baru.get("_wp_old_slug", "")
    if "practice-areas" not in lama:
        baru["_wp_old_slug"] = (lama + " practice-areas").strip()
    cf = [{"key": k, "value": v} for k, v in baru.items()]
    bal = rpc("wp.editPost", [1, USER, PASS, 12, {"custom_fields": cf}])
    fault = re.search(r"<name>faultString</name><value><string>(.*?)</string>", bal, re.S)
    print(f"   tulis: {'GAGAL — ' + fault.group(1)[:80] if fault else 'terkirim ✅'}")
    time.sleep(3)
    cek = rpc("wp.getPost", [1, USER, PASS, 12])
    f2 = re.findall(r"<member><name>key</name><value><string>(_[^<]+)</string></value></member>\s*"
                    r"<member><name>value</name><value><string>(.*?)</string>", cek, re.S)
    d2 = {k: html.unescape(v) for k, v in f2}
    print(f"   _wp_old_slug sekarang: {d2.get('_wp_old_slug')} | jumlah meta: {len(d2)}")
    print(f"   meta Yoast utuh: {d2.get('_yoast_wpseo_focuskw')} / {str(d2.get('_yoast_wpseo_title'))[:40]}")
else:
    print("   (dry run — jalankan dengan --pasang untuk memasang)")

print("\n=== 3. uji /practice-areas/ sekarang ===")
try:
    r = urllib.request.urlopen(urllib.request.Request("https://www.tslaw.id/practice-areas/", headers=UA), timeout=90)
    print(f"   status {r.status} | url akhir: {r.url}")
except urllib.error.HTTPError as e:
    print(f"   status {e.code} | Lokasi: {e.headers.get('Location')}")
except Exception as e:
    print("   gagal:", str(e)[:90])
