#!/usr/bin/env python3
"""TSC — data lengkap semua halaman + GSC, lalu peta topik untuk rencana perapian."""
import base64, importlib.util, json, os, re, time, urllib.error, urllib.request
from collections import defaultdict
from datetime import date, timedelta

from google.oauth2 import service_account
from googleapiclient.discovery import build

WS = "/home/mantapman/.hermes/profiles/atun/workspace"
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"]
SITE = f"https://www.{DOM}/"
AUTH = base64.b64encode(f"{CFG['user']}:{CFG['pass']}".encode()).decode()
UA = {"User-Agent": "Mozilla/5.0"}

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)


def rest(path):
    h = {"Authorization": f"Basic {AUTH}", **UA}
    r = urllib.request.Request(f"https://{DOM}{path}", headers=h)
    for i in range(4):
        try:
            with urllib.request.urlopen(r, timeout=120) as x:
                return json.loads(x.read())
        except urllib.error.HTTPError as e:
            if e.code in (429, 404):
                time.sleep(4)
                continue
            return {"err": e.code}
        except Exception:
            time.sleep(4)
    return {}


per_hal = {}
for r in gsc.searchanalytics().query(siteUrl=SITE, body={
        "startDate": AWAL.isoformat(), "endDate": AKHIR.isoformat(), "dimensions": ["page"],
        "rowLimit": 3000}).execute().get("rows", []):
    per_hal[r["keys"][0].rstrip("/")] = {"tayang": int(r["impressions"]), "klik": int(r["clicks"]),
                                         "pos": round(r["position"], 1)}

halaman = []
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,content,date")
        if not isinstance(d, list) or not d:
            break
        for x in d:
            u = x["link"].rstrip("/")
            g = per_hal.get(u, {"tayang": 0, "klik": 0, "pos": None})
            halaman.append({"jenis": jenis, "id": x["id"], "slug": x["slug"], "url": u,
                            "judul": re.sub(r"<[^>]+>", "", str(x["title"]["raw"]))[:90],
                            "kata": len(re.sub(r"<[^>]+>", " ", x["content"]["raw"]).split()),
                            "tgl": x["date"][:10], **g})
        if len(d) < 100:
            break
        page += 1
print(f"halaman: {len(halaman)} · punya tayangan: {sum(1 for x in halaman if x['tayang'])}")
json.dump(halaman, open(f"{WS}/drafts/tsc_semua_halaman.json", "w"), ensure_ascii=False, indent=1)

TOPIK = [
    ("jerawat", ["jerawat"]),
    ("bekas jerawat & flek", ["bekas-jerawat", "flek", "microneedling", "dermapen"]),
    ("klinik kecantikan krian", ["klinik-kecantikan", "kecantikan-krian", "klinik-estetika"]),
    ("dokter kulit krian", ["dokter-kulit-krian", "kulit-kelamin-krian", "krian-dokter"]),
    ("dokter kulit sidoarjo", ["dokter-kulit-sidoarjo", "spesialis-kulit-sidoarjo", "sidoarjo"]),
    ("kulit & kelamin (PMS, kutil, sifilis, herpes)", ["pms", "kelamin", "sifilis", "herpes", "kutil"]),
    ("facial & perawatan wajah", ["facial", "perawatan-wajah"]),
    ("anti aging, botox, filler, prp", ["anti-aging", "botox", "filler", "prp", "rejuvenation", "hidung"]),
    ("kulit berminyak & berjerawat", ["berminyak", "berjerawat"]),
    ("eksim, alergi, gatal", ["eksim", "alergi", "gatal", "dermatitis"]),
    ("kulit cantik & skin barrier", ["skin-barrier", "kulit-cantik", "melembapkan", "kenyal", "sunscreen"]),
    ("dokter & klinik (umum)", ["dokter-kulit", "klinik-kulit", "klinik-dni", "the-skin-code-clinic",
                                 "dr-avril", "dokter-spesialis"]),
]

grup = defaultdict(list)
for y in halaman:
    teks = (y["slug"] + " " + y["judul"]).lower()
    for nama, kunci in TOPIK:
        if any(k in teks for k in kunci):
            grup[nama].append(y)
            break

print("\n=== peta topik ===")
baris = []
for nama, isi in sorted(grup.items(), key=lambda x: -len(x[1])):
    isi.sort(key=lambda y: (-y["klik"], -y["tayang"], -y["kata"]))
    nol = [y for y in isi if y["tayang"] == 0]
    print(f"\n■ {nama}: {len(isi)} halaman · {len(nol)} tanpa tayangan")
    for i, y in enumerate(isi[:8]):
        tanda = "KANONIK" if i == 0 else ("nol    " if y["tayang"] == 0 else "gabung ")
        print(f"   {tanda} {y['tayang']:>4} tayang | {y['klik']:>2} klik | {y['kata']:>5} kata | /{y['slug'][:50]}")
    if len(isi) > 8:
        print(f"   … {len(isi) - 8} halaman lain")
    baris.append({"topik": nama, "kanonik": isi[0], "kandidat": isi[1:]})

json.dump(baris, open(f"{WS}/drafts/tsc_peta_topik.json", "w"), ensure_ascii=False, indent=1)
nol_total = [y for r in baris for y in r["kandidat"] if y["tayang"] == 0]
print(f"\nhalaman tanpa tayangan (kandidat dirapikan): {len(nol_total)}")
for y in sorted(nol_total, key=lambda z: -z["kata"])[:20]:
    print(f"   {y['kata']:>5} kata | #{y['id']:<5} | /{y['slug'][:62]}")
