#!/usr/bin/env python3
"""TSC halaman: query GSC per halaman + meta Yoast yang terpasang sekarang (via XML-RPC)."""
import base64, html, json, os, re, urllib.request, importlib.util
from xml.sax.saxutils import escape
from google.oauth2 import service_account
from googleapiclient.discovery import build

WS = "/home/mantapman/.hermes/profiles/atun/workspace"
KEY = os.path.expanduser("~/.hermes/gsc_service_account.json")
spec = importlib.util.spec_from_file_location("cfg_tsc", f"{WS}/cfg_tsc.py")
m = importlib.util.module_from_spec(spec); spec.loader.exec_module(m)
DOM, USER, PASS = m.CFG["domain"], m.CFG["user"], m.CFG["pass"]
AUTH = base64.b64encode(f"{USER}:{PASS}".encode()).decode()

gsc = build("searchconsole", "v1", credentials=service_account.Credentials.from_service_account_file(
    KEY, scopes=["https://www.googleapis.com/auth/webmasters.readonly"]), cache_discovery=False)
rows = gsc.searchanalytics().query(siteUrl="https://www.theskincodeclinic.com/", body={
    "startDate": "2026-06-28", "endDate": "2026-09-25", "dimensions": ["page", "query"],
    "rowLimit": 5000}).execute().get("rows", [])

HALAMAN = {"tentang-kami": "/tentang-kami", "articles": "/articles", "clients": "/clients"}


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://www.{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)[:80]}"


for pid, slug in ((1531, "tentang-kami"), (1585, "articles"), (6622, "clients")):
    print(f"\n{'='*88}\n### #{pid} /{slug}/")
    cocok = [r for r in rows if r["keys"][0].replace("https://www.theskincodeclinic.com", "").rstrip("/") == "/" + slug]
    cocok.sort(key=lambda r: -r["impressions"])
    imp = sum(r["impressions"] for r in cocok); klik = sum(r["clicks"] for r in cocok)
    print(f"   GSC 90 hari: {imp} impresi | {klik} klik")
    for r in cocok[:6]:
        print(f"      imp {r['impressions']:>3} | klik {r['clicks']} | pos {round(r['position'],1):>5} | {r['keys'][1][:56]}")
    isi = rpc("wp.getPost", [1, USER, PASS, pid])
    for kunci in ("_yoast_wpseo_focuskw", "_yoast_wpseo_title", "_yoast_wpseo_metadesc"):
        mm = re.search(r"<member><name>key</name><value><string>" + re.escape(kunci) +
                       r"</string></value></member>\s*<member><name>value</name><value><string>(.*?)</string>", isi, re.S)
        nilai = mm.group(1) if mm else "(belum diisi)"
        print(f"   {kunci:<24} {nilai[:96]}")
    hm = rpc("wp.getPost", [1, USER, PASS, pid])
    fault = re.search(r"<name>faultString</name><value><string>(.*?)</string>", hm, re.S)
    if fault:
        print(f"   ⚠️ XML-RPC: {fault.group(1)[:80]}")
