#!/usr/bin/env python3
"""Peta tumpang tindih konten DAS: klaster topik, impresi 90d, kandidat konsolidasi."""
import base64, html, json, os, re, urllib.request
from datetime import date, timedelta
from google.oauth2 import service_account
from googleapiclient.discovery import build

SITE = "https://dasindonesia.com"
AUTH = base64.b64encode(b"bambangbot:u3a1 G2pQ 3SWY f0zI OlGP YAjU").decode()
WS = os.path.dirname(os.path.abspath(__file__))

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)
e = date.today() - timedelta(days=2)
S90, END = (e - timedelta(days=89)).isoformat(), e.isoformat()
imp = {}
for r in gsc.searchanalytics().query(siteUrl=SITE + "/", body={"startDate": S90, "endDate": END,
                                                               "dimensions": ["page"], "rowLimit": 2000}).execute().get("rows", []):
    imp[r["keys"][0].rstrip("/")] = (int(r["impressions"]), int(r["clicks"]), r["position"])


def api(p):
    r = urllib.request.Request(SITE + p, headers={"Authorization": f"Basic {AUTH}", "User-Agent": "Mozilla/5.0"})
    return json.loads(urllib.request.urlopen(r, timeout=240).read())


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

KLASTER = {
    "alphard": ("alphard",), "lexus": ("lexus",), "mercy": ("mercy", "mercedes", "benz"),
    "bmw": ("bmw",), "toyota": ("toyota", "innova", "avanza", "fortuner", "rush", "calya", "veloz", "yaris", "camry"),
    "nissan": ("nissan",), "honda": ("honda", "hrv", "crv", "brio", "jazz", "mobilio"),
    "mitsubishi": ("mitsubishi", "xpander", "pajero"),
    "matic": ("matic", "cvt", "transmisi"), "overhaul": ("overhaul", "turun mesin"),
    "ac": ("ac mobil", "air conditioner", "kondensor", "freon"),
    "kaki": ("kaki-kaki", "shockbreaker", "suspensi", "bushing"),
    "oli": ("oli", "pelumas"), "aki": ("aki", "baterai"),
    "rem": ("rem", "brake"), "servis": ("servis", "service"),
    "minggu": ("minggu", "libur"), "bengkel-umum": ("bengkel mobil", "bengkel terbaik", "bengkel resmi", "bengkel spesialis"),
}

rows = []
for p in posts:
    jud = html.unescape(re.sub(r"&#?\w+;", " ", p["title"]["rendered"]))
    teks = (jud + " " + p["slug"]).lower()
    raw = p["content"]["raw"]
    kata = len(html.unescape(re.sub(r"<[^>]+>", " ", raw)).split())
    kl = [k for k, kws in KLASTER.items() if any(x in teks for x in kws)]
    link = p["link"].rstrip("/")
    i90, k90, pos = imp.get(link, (0, 0, 0))
    h2 = [re.sub("<[^>]+>", "", x) for x in re.findall(r"<h2[^>]*>(.*?)</h2>", raw, re.S)]
    rows.append({"id": p["id"], "slug": p["slug"], "judul": jud, "tgl": p["date"][:10], "kata": kata,
                 "klaster": kl, "imp": i90, "klik": k90, "pos": pos, "jml_h2": len(h2),
                 "h2": [html.unescape(x)[:60] for x in h2[:5] if x.strip()], "link": p["link"],
                 "pdf_ai": "SEO Focus Keyword" in raw or "Draft Artikel" in raw})

json.dump(rows, open(os.path.join(WS, "das_peta_konten.json"), "w"), indent=1, ensure_ascii=False)

nol = [r for r in rows if r["imp"] == 0]
print(f"total artikel: {len(rows)} | nol impresi 90d: {len(nol)}")
print("\n=== sebaran per klaster (jumlah, yang nol impresi) ===")
for k in KLASTER:
    anggota = [r for r in rows if k in r["klaster"]]
    n = [r for r in anggota if r["imp"] == 0]
    if anggota:
        print(f"  {k:<12} {len(anggota):>3} artikel | nol impresi: {len(n):>3}")

print("\n=== grup yang tumpang tindih (klaster sama, >1 artikel) ===")
for k in KLASTER:
    anggota = sorted([r for r in rows if k in r["klaster"]], key=lambda x: -x["imp"])
    if len(anggota) < 2:
        continue
    print(f"\n-- {k.upper()} ({len(anggota)} artikel) --")
    for r in anggota[:14]:
        tag = "NOL" if r["imp"] == 0 else f"{r['imp']} imp"
        print(f"   #{r['id']} {r['tgl']} {tag:>8} {r['kata']:>5} kata | {r['judul'][:66]}")
