#!/usr/bin/env python3
"""DAS — peta konten: kelompokkan artikel per klaster, tandai halaman uang, tipis, dan nol tayangan.
Keluaran: drafts/das_peta_konten.json + ringkasan di layar.
"""
import base64, html, importlib.util, json, os, re, time, urllib.error, urllib.request
from collections import defaultdict
from datetime import date, timedelta

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["domain"]
AUTH = base64.b64encode(f"{CFG['user']}:{CFG['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)

# klaster dari nama model / jenis layanan
KLASTER = {
    "nissan": ["nissan", "livina", "juke", "x-trail", "serena"],
    "toyota": ["toyota", "avanza", "innova", "fortuner", "camry", "vios", "yaris", "rush", "alphard"],
    "alphard": ["alphard", "vellfire"],
    "honda": ["honda", "mobilio", "brio", "hrv", "crv", "jazz"],
    "mercy": ["mercy", "mercedes", "bmw", "audi", "eropa"],
    "lexus": ["lexus"],
    "matic": ["matic", "cvt", "transmisi"],
    "diesel": ["diesel", "solar", "common rail"],
    "mitsubishi": ["mitsubishi", "xpander", "pajero"],
    "suzuki": ["suzuki", "ertiga", "swift", "ignis"],
    "lain": [],
}


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 {}


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")
    if not isinstance(d, list) or not d:
        break
    posts += d
    if len(d) < 100:
        break
    page += 1

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("/")] = {"tayang": int(r["impressions"]), "klik": int(r["clicks"]),
                                     "pos": round(r["position"], 1)}


def klaster(teks):
    t = teks.lower()
    hasil = [k for k, kata in KLASTER.items() if kata and any(x in t for x in kata)]
    return hasil[0] if hasil else "lain"


baris = []
for p in posts:
    raw = p["content"]["raw"]
    teks = html.unescape(re.sub(r"<[^>]+>", " ", raw))
    kata = len(teks.split())
    judul = html.unescape(p["title"]["rendered"])
    g = imp.get(p["link"].rstrip("/"), {"tayang": 0, "klik": 0, "pos": None})
    halaman_uang = bool(re.match(r"^bengkel-(spesialis|mobil)?", p["slug"])) and "bengkel" in p["slug"]
    baris.append({"id": p["id"], "slug": p["slug"], "judul": judul, "kata": kata, "tgl": p["date"][:10],
                  "klaster": klaster(p["slug"] + " " + judul), "tayang": g["tayang"], "klik": g["klik"],
                  "pos": g["pos"], "uang": halaman_uang})

print(f"total artikel: {len(baris)}")

print("\n=== per klaster ===")
per = defaultdict(lambda: {"n": 0, "tipis": 0, "nol": 0, "tayang": 0})
for b in baris:
    s = per[b["klaster"]]
    s["n"] += 1
    s["tipis"] += b["kata"] < 500
    s["nol"] += b["tayang"] == 0
    s["tayang"] += b["tayang"]
for k, s in sorted(per.items(), key=lambda x: -x[1]["tayang"]):
    print(f"  {k:<12} artikel {s['n']:>3} | tipis {s['tipis']:>3} | nol tayangan {s['nol']:>3} | "
          f"total tayangan {s['tayang']:>6}")

print("\n=== halaman uang (kandidat penopang klaster) ===")
for b in sorted([x for x in baris if x["uang"]], key=lambda x: -x["tayang"]):
    print(f"  {b['tayang']:>5} tayang | {b['klik']:>3} klik | pos {str(b['pos']):>5} | {b['kata']:>4} kata | /{b['slug'][:62]}")

print("\n=== 25 artikel tipis (<500 kata) dengan sudut klaster ===")
for b in sorted([x for x in baris if x["kata"] < 500], key=lambda x: (x["klaster"], -x["tayang"]))[:25]:
    print(f"  {b['klaster']:<10} {b['tayang']:>4} tayang | {b['kata']:>3} kata | /{b['slug'][:70]}")

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