#!/usr/bin/env python3
"""Audit gambar unggulan artikel TSLaw: yang belum punya, dan yang gambarnya dipakai berulang."""
import base64, json, re, time, urllib.error, urllib.request
from collections import Counter, defaultdict

SITUS = "https://www.tslaw.id"
AUTH = base64.b64encode(b"bambangbot:EFKm EYGx VQCP Y9go ncPr uM2Y").decode()
H = {"Authorization": f"Basic {AUTH}", "User-Agent": "Mozilla/5.0"}


def rest(path):
    r = urllib.request.Request(f"{SITUS}{path}", headers=H)
    for i in range(3):
        try:
            with urllib.request.urlopen(r, timeout=120) as x:
                return json.loads(x.read())
        except urllib.error.HTTPError as e:
            if e.code in (429, 404):
                time.sleep(4)
                continue
            return {"err": e.code}
        except Exception:
            time.sleep(4)
    return {}


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

tanpa = [p for p in posts if not p.get("featured_media")]
print(f"\n=== belum punya gambar unggulan: {len(tanpa)} ===")
for p in tanpa:
    print(f"   #{p['id']:<5} {p['date'][:10]} | {re.sub(r'<[^>]+>','',p['title']['rendered'])[:60]}")

print("\n=== gambar yang dipakai lebih dari satu artikel ===")
pakai = defaultdict(list)
for p in posts:
    if p.get("featured_media"):
        pakai[p["featured_media"]].append(p)
ulang = {k: v for k, v in pakai.items() if len(v) > 1}
print(f"   gambar unik dipakai: {len(pakai)} · dipakai berulang: {len(ulang)}")
for mid, daftar in sorted(ulang.items(), key=lambda x: -len(x[1]))[:12]:
    m = rest(f"/wp-json/wp/v2/media/{mid}?_fields=id,source_url")
    nama = (m.get("source_url") or "?").split("/")[-1] if isinstance(m, dict) else "?"
    print(f"   ⚠ media #{mid} dipakai {len(daftar)}× · {nama[:50]}")
    for p in daftar[:3]:
        print(f"        #{p['id']} {re.sub(r'<[^>]+>','',p['title']['rendered'])[:52]}")

print("\n=== pustaka media: berapa gambar tersedia ===")
med, page = [], 1
while True:
    d = rest(f"/wp-json/wp/v2/media?per_page=100&page={page}&orderby=date&order=desc&_fields=id,source_url,mime_type,title")
    if not isinstance(d, list) or not d:
        break
    med += d
    if len(d) < 100:
        break
    page += 1
gambar = [x for x in med if str(x.get("mime_type", "")).startswith("image/")]
dipakai = set(pakai)
print(f"   total media: {len(med)} · gambar: {len(gambar)} · belum dipakai: {len([x for x in gambar if x['id'] not in dipakai])}")

json.dump({"posts": posts, "tanpa": [p['id'] for p in tanpa], "ulang": {str(k): [p['id'] for p in v] for k, v in ulang.items()}},
          open("/home/mantapman/.hermes/profiles/atun/workspace/drafts/tslaw_audit_gambar.json", "w"), ensure_ascii=False, indent=1)
print("\n→ drafts/tslaw_audit_gambar.json")
