#!/usr/bin/env python3
"""DAS Bengkel — audit konten: jumlah artikel, pola terbit massal, duplikat, artikel nol impresi."""
import base64, html, json, os, re, time, urllib.error, urllib.request
from collections import Counter, defaultdict
from datetime import date, timedelta

import importlib.util
WS = "/home/mantapman/.hermes/profiles/atun/workspace"
spec = importlib.util.spec_from_file_location("cfg", f"{WS}/cfg_das.py")
m = importlib.util.module_from_spec(spec)
spec.loader.exec_module(m)
CFG = m.CFG
DOM = CFG.get("domain", "dasindonesia.com")
USER = CFG.get("user", "bambangbot")
PASS = CFG.get("pass") or CFG.get("app_password") or CFG.get("password")
AUTH = base64.b64encode(f"{USER}:{PASS}".encode()).decode()
UA = {"User-Agent": "Mozilla/5.0"}

from google.oauth2 import service_account
from googleapiclient.discovery import build
creds = service_account.Credentials.from_service_account_file(
    os.path.expanduser("~/.hermes/gsc_service_account.json"),
    scopes=["https://www.googleapis.com/auth/webmasters.readonly"])
gsc = build("webmasters", "v3", credentials=creds, cache_discovery=False)
AKHIR = date.today() - timedelta(days=2)
AWAL = AKHIR - timedelta(days=89)


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


print("=== 1. artikel yang terbit ===")
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,date,content,yoast_head_json")
    if not isinstance(d, list) or not d:
        break
    posts += d
    if len(d) < 100:
        break
    page += 1
print(f"   {len(posts)} artikel publish")

per_hari = Counter(p["date"][:10] for p in posts)
massal = {t: n for t, n in per_hari.items() if n >= 3}
print(f"   hari dengan >=3 artikel: {len(massal)} (total {sum(massal.values())} artikel)")
for t, n in sorted(massal.items(), reverse=True)[:10]:
    print(f"      {t}: {n} artikel")

judul = Counter(html.unescape(p["title"]["rendered"]).strip().lower() for p in posts)
kembar_judul = {k: v for k, v in judul.items() if v > 1}
angka = [p["slug"] for p in posts if re.search(r"-\d$", p["slug"])]
print(f"   judul kembar: {len(kembar_judul)} · slug berakhiran angka: {len(angka)}")

kata = [(len(html.unescape(re.sub(r"<[^>]+>", " ", p["content"]["raw"])).split()), p["id"], p["slug"]) for p in posts]
tipis = [x for x in kata if x[0] < 700]
print(f"   artikel < 700 kata: {len(tipis)}")
kata.sort()
print(f"   artikel < 500 kata: {sum(1 for x in kata if x[0] < 500)}")
print(f"   rata-rata panjang: {sum(x[0] for x in kata) // len(kata)} kata")

print("\n=== 2. impresi GSC 90 hari ===")
imp = {}
for r in gsc.searchanalytics().query(siteUrl=f"https://{DOM}/", body={
        "startDate": AWAL.isoformat(), "endDate": AKHIR.isoformat(), "dimensions": ["page"],
        "rowLimit": 5000}).execute().get("rows", []):
    imp[r["keys"][0].rstrip("/")] = int(r["impressions"])
nol = [p for p in posts if p["link"].rstrip("/") not in imp]
print(f"   halaman dengan impresi: {len(imp)}")
print(f"   artikel TANPA impresi 90 hari: {len(nol)} dari {len(posts)} "
      f"({len(nol) * 100 // len(posts)}%)")
if nol:
    print("   contoh (10 terbaru):")
    for p in sorted(nol, key=lambda x: x["date"], reverse=True)[:10]:
        print(f"      {p['date'][:10]} #{p['id']} {p['slug'][:60]}")

json.dump({"total": len(posts), "massal": massal, "nol_impresi": [p["id"] for p in nol],
           "tipis": [x[1] for x in tipis]},
          open(f"{WS}/drafts/das_audit_konten.json", "w"), ensure_ascii=False, indent=1)
print("\n→ drafts/das_audit_konten.json")
