#!/usr/bin/env python3
"""Cari CELAH keyword StudioSoft: query GSC yang tidak punya halaman khusus,
plus inventaris halaman yang sudah ada."""
import base64, html, json, os, re, time, urllib.request
from collections import defaultdict
from google.oauth2 import service_account
from googleapiclient.discovery import build

S = "https://studiosoft.id"
AUTH = base64.b64encode(b"bambangbot:q26r RePo BVy6 pwU2 F3z7 ouyl").decode()
creds = service_account.Credentials.from_service_account_file(
    os.path.expanduser("~/.hermes/gsc_service_account.json"),
    scopes=["https://www.googleapis.com/auth/webmasters.readonly"])
sc = build("searchconsole", "v1", credentials=creds, cache_discovery=False)

# ── 1. inventaris halaman
def wp(path):
    r = urllib.request.Request(S + path, headers={"Authorization": f"Basic {AUTH}", "User-Agent": "Mozilla/5.0"})
    for _ in range(3):
        try:
            with urllib.request.urlopen(r, timeout=150) as x:
                return json.loads(x.read())
        except Exception:
            time.sleep(4)
    return []

items, page = [], 1
for tipe in ("pages", "posts"):
    p = 1
    while True:
        d = wp(f"/wp-json/wp/v2/{tipe}?per_page=100&page={p}&_fields=id,link,title,status&status=publish")
        if not isinstance(d, list):
            break
        items += [{"tipe": tipe, **x} for x in d]
        if len(d) < 100:
            break
        p += 1
print(f"halaman+artikel terbit: {len(items)}  (pages: {sum(1 for i in items if i['tipe']=='pages')}, posts: {sum(1 for i in items if i['tipe']=='posts')})")

# ── 2. query + halaman
body = {"startDate": "2026-06-25", "endDate": "2026-09-23", "dimensions": ["query", "page"],
        "rowLimit": 5000, "dataState": "all"}
rows = sc.searchanalytics().query(siteUrl="https://studiosoft.id/", body=body).execute().get("rows", [])
print(f"pasangan query-halaman: {len(rows)}")

# ── 3. klasifikasi tema layanan
TEMA = {
    "seo": r"\bseo\b|search engine",
    "website": r"website|web\b|landing page|toko online|ecommerce|e-commerce|jasa buat web",
    "iklan": r"iklan|ads\b|adwords|google ads|facebook ads|meta ads|ppc|berbayar|promosi berbayar",
    "sosmed": r"social media|sosmed|instagram|tiktok|facebook page|konten sosial",
    "branding": r"branding|brand\b|logo|identitas visual|desain grafis",
    "konten": r"content|konten|copywriting|artikel|blog|seo konten",
    "maintenance": r"maintenance|perawatan website|hosting|domain|keamanan website",
    "aplikasi": r"aplikasi|mobile app|android|ios",
    "ai": r"\bai\b|kecerdasan artifisial|chatgpt|otomasi|automation|geo\b|generative",
    "fotografi": r"foto|video|videografi|produksi video|company profile video",
    "lain": r".*",
}
LOKASI = r"surabaya|sidoarjo|gresik|malang|jawa timur|jatim"

tema_query = defaultdict(lambda: {"imp": 0, "klik": 0, "queries": [], "halaman": defaultdict(int), "pos": []})
for r in rows:
    q, pg = r["keys"]
    tema = next(t for t, pat in TEMA.items() if re.search(pat, q, re.I))
    d = tema_query[tema]
    d["imp"] += r["impressions"]; d["klik"] += r["clicks"]
    d["halaman"][pg] += r["impressions"]
    d["pos"].append((r["impressions"], round(r["position"], 1)))
    d["queries"].append((r["impressions"], r["clicks"], round(r["position"], 1), q, pg))

print("\n=== impresi per tema layanan ===")
for t, d in sorted(tema_query.items(), key=lambda x: -x[1]["imp"]):
    hl = sorted(d["halaman"].items(), key=lambda x: -x[1])[:2]
    print(f"  {t:<12} imp {d['imp']:>6} | klik {d['klik']:>3} | halaman utama: {[h[0].replace('https://www.studiosoft.id','').replace('https://studiosoft.id','')[:40] for h in hl]}")

# ── 4. halaman yang ADA: apakah halaman layanan khusus per tema+lokasi?
print("\n=== URL yang ada, mengandung kata tema ===")
for t, pat in TEMA.items():
    if t == "lain":
        continue
    cocok = [i for i in items if re.search(pat, i["link"], re.I)]
    lok = [i for i in cocok if re.search(LOKASI, i["link"], re.I)]
    print(f"  {t:<12} URL cocok: {len(cocok):>3} | ada unsur lokasi: {len(lok):>3} | contoh: {[c['link'].replace('https://studiosoft.id','')[:42] for c in cocok[:3]]}")

json.dump({"tema": {k: {"imp": v["imp"], "klik": v["klik"],
                        "halaman": dict(v["halaman"]),
                        "queries": sorted(v["queries"], reverse=True)[:40]} for k, v in tema_query.items()}},
          open("drafts/ss_celah_tema.json", "w"), indent=1, ensure_ascii=False)
print("\n→ drafts/ss_celah_tema.json")
