#!/usr/bin/env python3
"""EveryBe: perbaiki halaman nol klik (/shop/ dan /tone-up-body-lotion/) — judul SEO + meta description.
Meta Yoast ditulis lewat XML-RPC (REST tidak mengeksposnya). Pakai --apply untuk menulis."""
import base64, html, json, re, sys, 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_everybe", f"{WS}/cfg_everybe.py")
m = importlib.util.module_from_spec(spec); spec.loader.exec_module(m)
CFG = m.CFG
DOM, USER, PASS = CFG.get("domain", "www.everybeofficial.com"), CFG["user"], CFG["pass"]
AUTH = base64.b64encode(f"{USER}:{PASS}".encode()).decode()
UA = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 Chrome/124.0 Safari/537.36"}

PERBAIKAN = {
    762: {   # /shop/
        "judul": "Produk EveryBe — Co Bloong, Feminine V Spray & Tone Up",
        "desc": ("Koleksi produk EveryBe: Co Bloong untuk pegal otot, Feminine V Spray untuk kesegaran "
                 "harian, dan Tone Up Body Lotion. Lihat detail serta cara pesannya."),
        "fokus": "produk everybe",
    },
    2663: {  # /tone-up-body-lotion-rahasia-kulit-cerah-halus-dan-merata-setiap-hari/ (halaman "tone up")
        "judul": "Tone Up Body Lotion EveryBe — Kulit Lebih Cerah & Merata",
        "desc": ("Tone Up Body Lotion EveryBe membantu mencerahkan dan meratakan warna kulit bila dipakai "
                 "rutin. Lihat manfaat, cara pakai, dan keterangannya di sini."),
        "fokus": "tone up body lotion everybe",
    },
}


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")
    for _ in range(2):
        try:
            with urllib.request.urlopen(r, timeout=150) as x:
                return x.read().decode("utf-8", "replace")
        except Exception:
            time.sleep(3)
    return ""


def meta_dari(isi):
    out = {}
    for mm in re.finditer(r"<member><name>key</name><value><string>(_[^<]+)</string></value></member>\s*"
                          r"<member><name>value</name><value><string>(.*?)</string>", isi, re.S):
        out.setdefault(mm.group(1), html.unescape(mm.group(2)))
    return out


def rest(p):
    r = urllib.request.Request(f"https://{DOM}{p}", headers={"Authorization": f"Basic {AUTH}", **UA})
    for _ in range(3):
        try:
            with urllib.request.urlopen(r, timeout=120) as x:
                return json.loads(x.read())
        except Exception:
            time.sleep(3)
    return []


# cari id halaman tone up
d = rest("/wp-json/wp/v2/pages?slug=tone-up-body-lotion&context=edit&_fields=id,slug,title")
if isinstance(d, list) and d:
    PERBAIKAN[d[0]["id"]] = PERBAIKAN.pop(None)
    print(f"halaman tone-up ditemukan: #{d[0]['id']}")
else:
    PERBAIKAN.pop(None, None)
    print("halaman tone-up tidak ditemukan lewat REST")

print("\n=== rencana ===")
for pid, p in PERBAIKAN.items():
    print(f"\n   #{pid}")
    print(f"      judul SEO : {p['judul']} ({len(p['judul'])} karakter)")
    print(f"      deskripsi : {p['desc']} ({len(p['desc'])} karakter)")
    print(f"      fokus     : {p['fokus']}")

if "--apply" in sys.argv:
    print("\n=== menulis ===")
    for pid, p in PERBAIKAN.items():
        before = meta_dari(rpc("wp.getPost", [1, USER, PASS, pid]))
        open(f"{WS}/drafts/everybe_meta_{pid}_sebelum.json", "w").write(
            json.dumps({k: v for k, v in before.items() if "yoast" in k}, indent=1, ensure_ascii=False))
        bal = rpc("wp.editPost", [1, USER, PASS, pid, {"custom_fields": [
            {"key": "_yoast_wpseo_title", "value": p["judul"]},
            {"key": "_yoast_wpseo_metadesc", "value": p["desc"]},
            {"key": "_yoast_wpseo_focuskw", "value": p["fokus"]}]}])
        fault = re.search(r"<name>faultString</name><value><string>(.*?)</string>", bal, re.S)
        print(f"   #{pid}: {'GAGAL — ' + fault.group(1)[:80] if fault else 'terkirim ✅'}")
        time.sleep(2)
        after = meta_dari(rpc("wp.getPost", [1, USER, PASS, pid]))
        print(f"      tersimpan: judul={str(after.get('_yoast_wpseo_title'))[:50]} | "
              f"desc={len(str(after.get('_yoast_wpseo_metadesc')))} char")
else:
    print("\n(dry run — pakai --apply)")
