#!/usr/bin/env python3
"""Audit kesehatan SEO seluruh artikel publish StudioSoft: kata, meta, keyphrase, gambar, FAQ, link internal."""
import base64, html, json, re, time, urllib.request, urllib.error

S = "https://studiosoft.id"
AUTH = base64.b64encode(b"bambangbot:q26r RePo BVy6 pwU2 F3z7 ouyl").decode()


def api(path):
    h = {"Authorization": f"Basic {AUTH}", "User-Agent": "Mozilla/5.0"}
    r = urllib.request.Request(S + path, headers=h)
    for _ in range(4):
        try:
            with urllib.request.urlopen(r, timeout=240) as x:
                return json.loads(x.read())
        except Exception:
            time.sleep(3)
    return []


posts, page = [], 1
while True:
    d = api(f"/wp-json/wp/v2/posts?per_page=100&page={page}&context=edit"
            f"&_fields=id,link,title,date,content,meta,featured_media,featured_media")
    posts += d
    if len(d) < 100:
        break
    page += 1

hasil = {"kata_kurang": 0, "meta_kosong": 0, "meta_luar_rentang": 0, "fk_kosong": 0,
         "tanpa_gambar": 0, "tanpa_faq": 0, "tanpa_link": 0, "total": len(posts)}
daftar_masalah = []
for p in posts:
    raw = p["content"]["raw"] if isinstance(p["content"], dict) else ""
    teks = html.unescape(re.sub(r"<[^>]+>", " ", raw))
    kata = len(teks.split())
    m = p.get("meta", {}) or {}
    md = m.get("_yoast_wpseo_metadesc", "") or ""
    fk = m.get("_yoast_wpseo_focuskw", "") or ""
    faq = "FAQPage" in raw
    link = len(set(re.findall(r'href="https://studiosoft\.id/([^"#?]+)', raw)))
    masalah = []
    if kata < 1000:
        masalah.append(f"{kata} kata")
        hasil["kata_kurang"] += 1
    if not md:
        masalah.append("meta kosong"); hasil["meta_kosong"] += 1
    elif not (120 <= len(md) <= 158):
        masalah.append(f"meta {len(md)} char"); hasil["meta_luar_rentang"] += 1
    if not fk:
        masalah.append("tanpa keyphrase"); hasil["fk_kosong"] += 1
    if not p.get("featured_media"):
        masalah.append("tanpa gambar"); hasil["tanpa_gambar"] += 1
    if not faq:
        masalah.append("tanpa FAQ"); hasil["tanpa_faq"] += 1
    if link == 0:
        masalah.append("tanpa link internal"); hasil["tanpa_link"] += 1
    if masalah:
        daftar_masalah.append({"id": p["id"], "kata": kata, "judul": html.unescape(p["title"]["rendered"]),
                               "link": p["link"], "masalah": masalah})

json.dump(daftar_masalah, open("ss_audit_kesehatan.json", "w"), indent=1, ensure_ascii=False)
print(f"=== KESEHATAN SEO STUDIOSOFT — {hasil['total']} artikel publish ===\n")
print(f"  kata < 1.000          : {hasil['kata_kurang']:>3} artikel")
print(f"  meta description kosong: {hasil['meta_kosong']:>3}")
print(f"  meta di luar 120-158  : {hasil['meta_luar_rentang']:>3}")
print(f"  focus keyphrase kosong: {hasil['fk_kosong']:>3}")
print(f"  tanpa featured image  : {hasil['tanpa_gambar']:>3}")
print(f"  tanpa FAQ + schema    : {hasil['tanpa_faq']:>3}")
print(f"  tanpa link internal   : {hasil['tanpa_link']:>3}")
print(f"\n  artikel dengan minimal 1 masalah: {len(daftar_masalah)} dari {hasil['total']}")
bersih = hasil["total"] - len(daftar_masalah)
print(f"  artikel sehat penuh (semua kriteria): {bersih}")
