#!/usr/bin/env python3
"""DAS: petakan klaster kanibal — beberapa URL yang berebut topik mobil yang sama.
Sumber: daftar artikel (REST) + performa GSC per halaman."""
import base64, json, re, time, urllib.request, urllib.error, importlib.util
from collections import defaultdict

WS = "/home/mantapman/.hermes/profiles/atun/workspace"
spec = importlib.util.spec_from_file_location("cfg_das", f"{WS}/cfg_das.py")
m = importlib.util.module_from_spec(spec); spec.loader.exec_module(m)
CFG = m.CFG
DOM, AUTH = CFG["domain"], base64.b64encode(f'{CFG["user"]}:{CFG["pass"]}'.encode()).decode()
UA = {"User-Agent": "Mozilla/5.0"}

# nama model / topik yang sering jadi sasaran beberapa artikel sekaligus
TOPIK = ["innova", "alphard", "vellfire", "xpander", "pajero", "lexus", "nissan", "livina", "datsun",
         "hr-v", "hrv", "brio", "mobilio", "camry", "land cruiser", "landcruiser", "fortuner", "yaris",
         "avanza", "ertiga", "bmw", "mercy", "jazz", "rush", "terra", "triton", "hilux", "strada",
         "xpander cross", "corolla", "civic", "sigra", "ayla", "agnya", "sonet", "seltos", "cr-v", "crv"]


def rest(p):
    r = urllib.request.Request(f"https://{DOM}{p}", headers={"Authorization": f"Basic {AUTH}", **UA})
    for _ in range(3):
        try:
            with urllib.request.urlopen(r, timeout=180) as x:
                return json.loads(x.read())
        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&_fields=id,slug,link,title,content,date")
    if not isinstance(d, list):
        break
    posts += d
    if len(d) < 100:
        break
    page += 1
pages = rest("/wp-json/wp/v2/pages?per_page=50&context=edit&_fields=id,slug,link,title,content")
semua = [{"jenis": "artikel", **p} for p in posts] + [{"jenis": "halaman", **p} for p in pages]
print(f"artikel {len(posts)} + halaman {len(pages)}\n")

# performa GSC
gsc = {}
try:
    d = json.load(open(f"{WS}/drafts/das_data_seo_20260929.json"))
    for x in d["ini"]["halaman"]:
        gsc[x["u"].rstrip("/")] = x
    for x in d["lalu"]["halaman"]:
        u = x["u"].rstrip("/")
        gsc.setdefault(u, {"klik": 0, "tayang": 0, "pos": 0})
        gsc[u + "#lalu"] = x
except Exception as e:
    print("data GSC tidak terbaca:", e)

# kelompokkan per topik
klaster = defaultdict(list)
for p in semua:
    teks = (p["slug"] + " " + (p["title"]["raw"] if "raw" in p["title"] else "")).lower()
    panjang = len(re.sub(r"<[^>]+>", " ", p["content"]["raw"]))
    for t in TOPIK:
        if t in teks:
            kunci = t.replace(" ", "-")
            klaster[kunci].append({"id": p["id"], "jenis": p["jenis"], "slug": p["slug"], "link": p["link"],
                                   "judul": p["title"]["raw"][:70], "kata": panjang // 6,
                                   "klik": gsc.get(p["link"].rstrip("/"), {}).get("klik", 0),
                                   "tayang": gsc.get(p["link"].rstrip("/"), {}).get("tayang", 0),
                                   "pos": gsc.get(p["link"].rstrip("/"), {}).get("pos", 0)})
            break

print("=== klaster yang isinya lebih dari satu URL ===")
hasil = {}
for t, isi in sorted(klaster.items(), key=lambda x: -len(x[1])):
    if len(isi) < 2:
        continue
    isi.sort(key=lambda x: -x["klik"])
    total_kat = sum(x["kata"] for x in isi)
    hasil[t] = isi
    print(f"\n   ■ {t.upper()} — {len(isi)} URL")
    for x in isi:
        print(f"      #{x['id']:>5} {x['jenis']:<7} {x['kata']:>5} kata | {x['klik']:>3} klik | {x['tayang']:>5} tayang | pos {x['pos']:>5} | /{x['slug'][:60]}")

print(f"\n=== ringkasan: {len(hasil)} klaster, {sum(len(v) for v in hasil.values())} URL terlibat ===")
json.dump(hasil, open(f"{WS}/drafts/das_klaster_kanibal.json", "w"), indent=1, ensure_ascii=False)
print("→ drafts/das_klaster_kanibal.json")
