#!/usr/bin/env python3
"""Cek calon topik artikel TSC terhadap SELURUH artikel & halaman (kanibalisasi).

Pakai: python3 tsc_cek_topik.py "Judul calon" ["kata kunci fokus"]
Keluar kode 1 kalau ada halaman lama yang terlalu mirip (>=0,30) atau kata kunci fokusnya sama.
Peta halaman di-cache 6 jam di drafts/tsc_peta_halaman.json.
"""
import base64, importlib.util, html, json, os, re, sys, time, urllib.error, urllib.request

WS = "/home/mantapman/.hermes/profiles/atun/workspace"
sys.path.insert(0, WS)
from tsc_http import rest_json

spec = importlib.util.spec_from_file_location("cfg", f"{WS}/cfg_tsc.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"}
CACHE = f"{WS}/drafts/tsc_peta_halaman.json"
STOP = set("""yang untuk dan dari dengan pada dalam adalah ini itu cara tips panduan lengkap penting
mengapa kenapa bagaimana di ke atau agar supaya bisnis usaha surabaya sidoarjo krian indonesia 2026
dokter kulit klinik the skin code clinic kamu anda konsultasi terdekat dekat""".split())


def rest(path):
    for i in range(3):
        try:
            st, data = rest_json("GET", path)
            if st == 200:
                return data
            time.sleep(3)
        except Exception:
            time.sleep(3)
    return {}


def segar():
    return os.path.exists(CACHE) and (time.time() - os.path.getmtime(CACHE)) < 6 * 3600


def tarik():
    peta = []
    for jenis in ("posts", "pages"):
        page = 1
        while True:
            d = rest(f"/wp-json/wp/v2/{jenis}?per_page=100&page={page}&status=publish&context=edit"
                     f"&_fields=id,slug,link,title,meta")
            if not isinstance(d, list) or not d:
                break
            for x in d:
                peta.append({"id": x["id"], "jenis": jenis, "slug": x["slug"],
                             "judul": html.unescape(re.sub(r"<[^>]+>", "", str(x["title"]["raw"]))),
                             "fokus": ((x.get("meta") or {}).get("_yoast_wpseo_focuskw") or "").strip()})
            if len(d) < 100:
                break
            page += 1
    json.dump(peta, open(CACHE, "w"), ensure_ascii=False, indent=1)
    return peta


def kunci(teks):
    return {w for w in re.findall(r"[a-z]{4,}", teks.lower()) if w not in STOP}


def jaccard(a, b):
    return len(a & b) / max(1, len(a | b))


peta = json.load(open(CACHE)) if segar() else tarik()
judul = sys.argv[1] if len(sys.argv) > 1 else ""
fokus = sys.argv[2] if len(sys.argv) > 2 else ""
if not judul:
    print('pakai: python3 tsc_cek_topik.py "Judul calon" ["fokus"]')
    sys.exit(2)

k = kunci(judul + " " + fokus)
skor = sorted(((jaccard(k, kunci(p["judul"] + " " + p["fokus"])), p) for p in peta), key=lambda x: -x[0])
print(f"calon: «{judul}» · fokus «{fokus}»")
print(f"diperiksa terhadap {len(peta)} halaman TSC\n")
bahaya = []
for s, p in skor[:5]:
    tanda = " ⚠" if s >= 0.30 or (fokus and p["fokus"].lower() == fokus.lower()) else ""
    print(f"  {s:.2f} #{p['id']:>5} [{p['jenis'][:5]}] {p['judul'][:58]}{tanda}")
    if tanda:
        bahaya.append(p)
if bahaya:
    print(f"\nHASIL: BENTURAN — {len(bahaya)} halaman mirip. Ganti sudut atau judulnya.")
    sys.exit(1)
print("\nHASIL: aman, belum ada yang mirip.")
