#!/usr/bin/env python3
"""Celah keyword: (a) query tanpa halaman khusus (mendarat di beranda/artikel tak relevan),
(b) isi query per tema yang belum punya halaman layanan, (c) konversi per halaman dari GA4."""
import html, json, os, re, urllib.request
from collections import defaultdict
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"])
sc = build("searchconsole", "v1", credentials=creds, cache_discovery=False)
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", [])

# ── (a) query yang mendarat di BERANDA = tidak ada halaman khusus
beranda = defaultdict(lambda: {"imp": 0, "klik": 0, "pos": []})
nyasar = defaultdict(lambda: {"imp": 0, "klik": 0, "pos": [], "halaman": set()})
for r in rows:
    q, pg = r["keys"]
    bersih = pg.replace("https://www.studiosoft.id", "").replace("https://studiosoft.id", "")
    if bersih in ("/", ""):
        beranda[q]["imp"] += r["impressions"]; beranda[q]["klik"] += r["clicks"]; beranda[q]["pos"].append(r["position"])
    else:
        nyasar[q]["imp"] += r["impressions"]; nyasar[q]["klik"] += r["clicks"]
        nyasar[q]["pos"].append(r["position"]); nyasar[q]["halaman"].add(bersih)

print("=== A. keyword bernilai yang HANYA dilayani beranda (tidak ada halaman khusus) ===")
kand = [(q, d) for q, d in beranda.items() if d["imp"] >= 5]
kand.sort(key=lambda x: -x[1]["imp"])
for q, d in kand[:25]:
    pos = round(sum(d["pos"]) / len(d["pos"]), 1)
    print(f"  imp {d['imp']:>4} | klik {d['klik']:>2} | pos {pos:>5} | {q[:62]}")

# ── (b) isi query per tema celah
TEMA = {
    "iklan/ads": r"iklan|google ads|facebook ads|meta ads|\bads\b|adwords|ppc|berbayar",
    "sosmed": r"social media|sosmed|instagram|tiktok|kelola.*(ig|instagram)|admin sosial",
    "aplikasi": r"aplikasi|mobile app|android|ios|software|sistem informasi",
    "maintenance": r"maintenance|perawatan website|jasa hosting|kelola website",
    "video/foto": r"video|foto|company profile|videografi|produksi",
}
print("\n=== B. permintaan per tema celah (dari seluruh query GSC) ===")
for t, pat in TEMA.items():
    cocok = []
    for r in rows:
        q, pg = r["keys"]
        if re.search(pat, q, re.I):
            cocok.append((r["impressions"], r["clicks"], round(r["position"], 1), q,
                          pg.replace("https://www.studiosoft.id", "").replace("https://studiosoft.id", "")))
    cocok.sort(reverse=True)
    if not cocok:
        print(f"\n  {t}: tidak ada query sama sekali di GSC → benar-benar kosong")
        continue
    tot = sum(c[0] for c in cocok)
    print(f"\n  {t}: {len(cocok)} query | {tot} impresi | {sum(c[1] for c in cocok)} klik")
    for imp, klik, pos, q, pg in cocok[:8]:
        print(f"     imp {imp:>4} | klik {klik} | pos {pos:>5} | {q[:52]:<54} {pg[:36]}")

# ── (c) GA4: halaman pendaratan yang menghasilkan konversi
print("\n=== C. GA4: halaman pendaratan + kejadian konversi (90 hari) ===")
try:
    ga = build("analyticsdata", "v1beta", credentials=service_account.Credentials.from_service_account_file(
        os.path.expanduser("~/.hermes/gsc_service_account.json"),
        scopes=["https://www.googleapis.com/auth/analytics.readonly"]), cache_discovery=False)
    PROP = "properties/533517024"
    req = {"dateRanges": [{"startDate": "2026-06-25", "endDate": "2026-09-23"}],
           "dimensions": [{"name": "landingPagePlusQueryString"}, {"name": "sessionDefaultChannelGroup"}],
           "metrics": [{"name": "sessions"}, {"name": "keyEvents"}, {"name": "userEngagementDuration"}],
           "limit": 40, "orderBys": [{"metric": {"metricName": "keyEvents"}, "desc": True}]}
    res = ga.properties().runReport(property=PROP, body=req).execute()
    for row in res.get("rows", []):
        lp, ch = row["dimensionValues"][0]["value"], row["dimensionValues"][1]["value"]
        ses, ke = row["metricValues"][0]["value"], row["metricValues"][1]["value"]
        dur = round(float(row["metricValues"][2]["value"]) / max(int(ses), 1))
        if int(ke) > 0 or int(ses) >= 15:
            print(f"  kejadian {ke:>3} | sesi {ses:>4} | {dur:>4}s | {ch:<16} | {lp[:58]}")
except Exception as e:
    print("  GA4 gagal:", str(e)[:150])
