#!/usr/bin/env python3
"""DAS: audit 150 artikel — panjang, meta Yoast, tautan internal, yatim, dan performa GSC/GA4."""
import base64, html, json, os, re, time, urllib.request, urllib.error, importlib.util
from collections import Counter

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


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=180) as x:
                return json.loads(x.read())
        except Exception:
            time.sleep(3)
    return []


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

ringkas = []
for p in posts:
    raw = p.get("content", {}).get("raw", "") or ""
    teks = re.sub(r"\s+", " ", html.unescape(re.sub(r"<[^>]+>", " ", re.sub(r"<(script|style)[^>]*>.*?</\1>", " ", raw, flags=re.S | re.I))))
    keluar = set(re.findall(r'href="https://dasindonesia\.com(/[^"]*)"', raw))
    wa = len(re.findall(r"wa\.me|api\.whatsapp\.com", raw, re.I))
    fokus = (p.get("meta") or {}).get("_yoast_wpseo_focuskw") or ""
    meta = (p.get("meta") or {}).get("_yoast_wpseo_metadesc") or ""
    ringkas.append({"id": p["id"], "slug": p["slug"], "url": "/" + p["slug"] + "/",
                    "judul": html.unescape(p["title"]["rendered"]), "kata": len(teks.split()),
                    "keluar": sorted(keluar), "wa": wa, "fokus": fokus, "meta": meta, "meta_len": len(meta),
                    "gambar": p.get("featured_media", 0), "tgl": p["date"][:10]})

print("\n=== GSC per artikel (90 hari) ===")
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://dasindonesia.com/", body={
    "startDate": "2026-07-01", "endDate": "2026-09-28", "dimensions": ["page"], "rowLimit": 5000}).execute().get("rows", [])
gm = {}
for r in rows:
    u = r["keys"][0].replace("https://dasindonesia.com", "").rstrip("/") or "/"
    gm[u] = {"imp": r["impressions"], "klik": r["clicks"], "pos": round(r["position"], 1)}
for a in ringkas:
    g = gm.get(a["url"].rstrip("/"), {})
    a.update({"imp": g.get("imp", 0), "klik": g.get("klik", 0), "pos": g.get("pos")})

print("\n=== 1. panjang artikel ===")
for band, lo, hi in (("di bawah 600", 0, 600), ("600-999", 600, 1000), ("1.000-1.499", 1000, 1500), ("1.500+", 1500, 99999)):
    sel = [a for a in ringkas if lo <= a["kata"] < hi]
    if sel:
        print(f"   {band:<12} {len(sel):>4} artikel | impresi rata2 {round(sum(x['imp'] for x in sel)/len(sel),1):>6} | klik rata2 {round(sum(x['klik'] for x in sel)/len(sel),2)}")

print("\n=== 2. meta & fokus ===")
print(f"   tanpa focus keyphrase : {sum(1 for a in ringkas if not a['fokus'])}")
print(f"   tanpa meta desc       : {sum(1 for a in ringkas if not a['meta'])}")
print(f"   meta > 158 char       : {sum(1 for a in ringkas if a['meta_len'] > 158)}")
print(f"   tanpa gambar utama    : {sum(1 for a in ringkas if not a['gambar'])}")
print(f"   tanpa tombol WA       : {sum(1 for a in ringkas if not a['wa'])}")

print("\n=== 3. tautan internal ===")
masuk = Counter()
for a in ringkas:
    for k in a["keluar"]:
        masuk[k.strip("/")] = masuk.get(k.strip("/"), 0) + 1
yatim = [a for a in ringkas if masuk.get(a["slug"], 0) == 0]
print(f"   tanpa tautan keluar   : {sum(1 for a in ringkas if not a['keluar'])}")
print(f"   yatim (tak ditautkan) : {len(yatim)}")

print("\n=== 4. artikel dengan impresi terbesar (masih hidup) ===")
for a in sorted(ringkas, key=lambda x: -x["imp"])[:12]:
    print(f"   imp {a['imp']:>5} | klik {a['klik']:>3} | pos {str(a['pos'] or '-'):>5} | {a['kata']:>5} kata | {a['url'][:52]}")

print("\n=== 5. berimpresi tapi NOL klik (peluang cuplikan) ===")
nol = [a for a in ringkas if a["imp"] >= 10 and a["klik"] == 0]
nol.sort(key=lambda x: -x["imp"])
for a in nol[:12]:
    print(f"   imp {a['imp']:>4} | pos {str(a['pos']):>5} | kata {a['kata']:>5} | {a['url'][:50]:<52} | meta {a['meta_len']} char")

json.dump(ringkas, open(f"{WS}/drafts/das_audit_artikel_20260929.json", "w"), indent=1, ensure_ascii=False)
print(f"\n→ drafts/das_audit_artikel_20260929.json")
