#!/usr/bin/env python3
"""TSLaw: audit SEO seluruh artikel (56 post) — meta, panjang, gambar, tautan internal, dan yatim."""
import base64, html, json, os, re, time, urllib.request, urllib.error
from collections import Counter

DOM = "tslaw.id"
AUTH = base64.b64encode(b"bambangbot:EFKm EYGx VQCP Y9go ncPr uM2Y").decode()
UA = {"User-Agent": "Mozilla/5.0"}
KEY = os.path.expanduser("~/.hermes/gsc_service_account.json")


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


print("=== menarik semua artikel (termasuk meta) ===")
posts = []
page = 1
while True:
    d = rest(f"/wp-json/wp/v2/posts?per_page=100&page={page}&status=publish,draft,future"
             f"&context=edit&_fields=id,slug,link,title,content,meta,categories,tags,featured_media,status,date")
    if not isinstance(d, list):
        break
    posts += d
    if len(d) < 100:
        break
    page += 1
print(f"   {len(posts)} artikel")

ringkas = []
for p in posts:
    raw = p.get("content", {}).get("raw", "") if isinstance(p.get("content"), dict) else ""
    teks = re.sub(r"\s+", " ", html.unescape(re.sub(r"<[^>]+>", " ", re.sub(r"<(script|style)[^>]*>.*?</\1>", " ", raw, flags=re.S | re.I))))
    kata = len([w for w in teks.split() if w])
    m = p.get("meta") or {}
    fokus = (m.get("_yoast_wpseo_focuskw") or "").strip()
    meta = (m.get("_yoast_wpseo_metadesc") or "").strip()
    keluar = set(re.findall(r'href="https://www\.tslaw\.id(/[^"]*)"', raw))
    ringkas.append({"id": p["id"], "slug": p["slug"], "judul": html.unescape(p["title"]["rendered"]),
                    "kata": kata, "fokus": fokus, "meta": meta, "meta_len": len(meta),
                    "gambar": p.get("featured_media", 0), "kategori": p.get("categories", []),
                    "tag": len(p.get("tags", [])), "keluar": keluar, "status": p.get("status"),
                    "raw": raw})

print("\n=== 1. panjang artikel ===")
pendek = [a for a in ringkas if a["kata"] < 1000]
print(f"   di bawah 1.000 kata: {len(pendek)} dari {len(ringkas)}")
for a in sorted(pendek, key=lambda x: x["kata"])[:12]:
    print(f"      {a['kata']:>5} kata | #{a['id']:>5} {a['slug'][:52]}")

print("\n=== 2. keyphrase & meta description ===")
tanpa_fokus = [a for a in ringkas if not a["fokus"]]
tanpa_meta = [a for a in ringkas if not a["meta"]]
meta_panjang = [a for a in ringkas if a["meta_len"] > 158]
print(f"   tanpa keyphrase     : {len(tanpa_fokus)}")
print(f"   tanpa meta desc     : {len(tanpa_meta)}")
print(f"   meta >158 char      : {len(meta_panjang)}")
for a in tanpa_meta[:10]:
    print(f"      #{a['id']:>5} {a['slug'][:60]}")

print("\n=== 3. gambar utama & kategori ===")
tanpa_gambar = [a for a in ringkas if not a["gambar"]]
print(f"   tanpa gambar utama  : {len(tanpa_gambar)}")
print(f"   sebaran kategori    : {dict(Counter(tuple(a['kategori']) for a in ringkas).most_common(4))}")

print("\n=== 4. tautan internal ===")
semua_slug = {a["slug"] for a in ringkas}
masuk = Counter()
for a in ringkas:
    for tujuan in a["keluar"]:
        t = tujuan.strip("/").split("/")[-1]
        if t:
            masuk[t] += 1
yatim = [a for a in ringkas if masuk.get(a["slug"], 0) == 0]
tanpa_keluar = [a for a in ringkas if len(a["keluar"]) == 0]
print(f"   artikel tanpa tautan keluar : {len(tanpa_keluar)}")
print(f"   artikel yatim (tak ditautkan): {len(yatim)}")
print(f"   halaman paling sering ditautkan: {masuk.most_common(6)}")

print("\n=== 5. artikel berimpresi tapi nol klik (GSC 90 hari) ===")
try:
    from google.oauth2 import service_account
    from googleapiclient.discovery import build
    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.tslaw.id/", body={
        "startDate": "2026-06-28", "endDate": "2026-09-25", "dimensions": ["page"], "rowLimit": 5000}).execute().get("rows", [])
    for r in sorted(rows, key=lambda x: -x["impressions"])[:12]:
        u = r["keys"][0].replace("https://www.tslaw.id", "")
        print(f"   imp {r['impressions']:>4} | klik {r['clicks']:>2} | pos {round(r['position'],1):>5} | {u[:56]}")
except Exception as e:
    print("   gagal ambil GSC:", str(e)[:80])

json.dump([{k: v for k, v in a.items() if k != "raw"} | {"keluar": sorted(a["keluar"])} for a in ringkas],
          open("/home/mantapman/.hermes/profiles/atun/workspace/drafts/tslaw_audit_artikel.json", "w"), indent=1, ensure_ascii=False)
print("\n→ data lengkap: drafts/tslaw_audit_artikel.json")
