#!/usr/bin/env python3
"""Data SEO seluruh klien: GSC (28 hari vs sebelumnya), GA4 (kanal + kejadian), dan posisi Serper.

Keluaran: drafts/seo_semua_klien_<tanggal>.md + .json
"""
import importlib.util, json, os, time, urllib.error, urllib.request
from datetime import date, timedelta

WS = "/home/mantapman/.hermes/profiles/atun/workspace"
spec = importlib.util.spec_from_file_location("kpi", f"{WS}/kpi_konfigurasi_klien.py")
kpi = importlib.util.module_from_spec(spec)
spec.loader.exec_module(kpi)
KLIEN = kpi.KLIEN

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",
            "https://www.googleapis.com/auth/analytics.readonly"])
gsc = build("webmasters", "v3", credentials=creds, cache_discovery=False)
ga = build("analyticsdata", "v1beta", credentials=creds, cache_discovery=False)

AKHIR = date.today() - timedelta(days=2)
A28 = AKHIR - timedelta(days=27)
B28 = A28 - timedelta(days=28)
B28_AKHIR = A28 - timedelta(days=1)
SEKARANG = date.today().isoformat()

SERPER = json.load(open(f"{WS}/.serper_token.json"))["key"]
HS = {"X-API-KEY": SERPER, "Content-Type": "application/json", "User-Agent": "Mozilla/5.0"}


def gsc_total(site, a, b):
    try:
        r = gsc.searchanalytics().query(siteUrl=site, body={
            "startDate": a.isoformat(), "endDate": b.isoformat()}).execute().get("rows", [])
        if not r:
            return 0, 0, 0.0
        x = r[0]
        return int(x["clicks"]), int(x["impressions"]), round(x["position"], 1)
    except Exception as e:
        return None, None, str(e)[:40]


def gsc_dim(site, a, b, dim, limit=10):
    try:
        return gsc.searchanalytics().query(siteUrl=site, body={
            "startDate": a.isoformat(), "endDate": b.isoformat(), "dimensions": [dim],
            "rowLimit": limit}).execute().get("rows", [])
    except Exception:
        return []


def ga4(prop, a, b, dims, mets, order=None, limit=10):
    try:
        body = {"dateRanges": [{"startDate": a.isoformat(), "endDate": b.isoformat()}],
                "dimensions": [{"name": d} for d in dims],
                "metrics": [{"name": m} for m in mets], "limit": limit}
        if order:
            body["orderBys"] = [{"metric": {"metricName": order}, "desc": True}]
        return ga.properties().runReport(property=prop, body=body).execute().get("rows", [])
    except Exception as e:
        return [{"err": str(e)[:60]}]


def serper(q):
    try:
        body = json.dumps({"q": q, "gl": "id", "hl": "id", "num": 20}).encode()
        d = json.loads(urllib.request.urlopen(urllib.request.Request(
            "https://google.serper.dev/search", data=body, headers=HS), timeout=90).read())
        org = d.get("organic") or []
        return org
    except Exception:
        return []


def domain_dari(gsc_prop):
    """Ambil nama domain dari properti GSC (https://www.x.com/ atau sc-domain:x.com)."""
    d = gsc_prop.replace("sc-domain:", "").replace("https://", "").replace("http://", "").strip("/")
    return d[4:] if d.startswith("www.") else d


hasil = []
for k in KLIEN:
    nama, slug, site = k["nama"], k["slug"], k["gsc"]
    dom = domain_dari(site)
    prop = f"properties/{k['ga4']}"
    print(f"■ {nama} …", flush=True)

    k1, t1, p1 = gsc_total(site, A28, AKHIR)
    k0, t0, p0 = gsc_total(site, B28, B28_AKHIR)
    ku = gsc_dim(site, A28, AKHIR, "query", 500)
    ha = gsc_dim(site, A28, AKHIR, "page", 5)

    kanal = ga4(prop, A28, AKHIR, ["sessionDefaultChannelGroup"], ["sessions", "keyEvents"], "sessions", 6)
    halaman_ga = ga4(prop, A28, AKHIR, ["landingPagePlusQueryString"], ["sessions"], "sessions", 5)

    serp = []
    for kw in k.get("kata", [])[:4]:
        org = serper(kw)
        pos = next((i for i, h in enumerate(org, 1) if dom in str(h.get("link", "")).lower()), None)
        serp.append({"kata_kunci": kw, "posisi": pos,
                     "tiga_teratas": [str(h.get("link", "")).split("/")[2].replace("www.", "")
                                      for h in org[:3]]})
        time.sleep(0.5)

    hasil.append({
        "nama": nama, "slug": slug, "gsc": site,
        "klik28": k1, "tayang28": t1, "posisi28": p1,
        "klik_lalu": k0, "tayang_lalu": t0, "posisi_lalu": p0,
        "kueri": len(ku), "kueri_teratas": [(int(r["impressions"]), int(r["clicks"]),
                                             round(r["position"], 1), r["keys"][0]) for r in
                                            sorted(ku, key=lambda x: -x["impressions"])[:5]],
        "halaman_teratas": [(int(r["impressions"]), int(r["clicks"]), r["keys"][0].replace("https://", ""))
                            for r in ha],
        "kanal": [(r["dimensionValues"][0]["value"], int(r["metricValues"][0]["value"]),
                   int(r["metricValues"][1]["value"])) for r in kanal if "err" not in r],
        "kanal_err": kanal[0].get("err") if kanal and "err" in kanal[0] else None,
        "halaman_ga": [(int(r["metricValues"][0]["value"]), r["dimensionValues"][0]["value"][:44])
                       for r in halaman_ga if "err" not in r],
        "serp": serp,
    })
    time.sleep(0.5)

json.dump({"periode": [A28.isoformat(), AKHIR.isoformat()], "data": hasil},
          open(f"{WS}/drafts/seo_semua_klien_{SEKARANG}.json", "w"), ensure_ascii=False, indent=1)

with open(f"{WS}/drafts/seo_semua_klien_{SEKARANG}.md", "w") as f:
    f.write(f"# Data SEO klien yang masih aktif — {SEKARANG}\n\n")
    f.write(f"Sumber: Google Search Console (28 hari: {A28} s/d {AKHIR}, dibanding 28 hari sebelumnya) "
            f"dan GA4. Posisi kata kunci dari Serper (Google, gl=id).\n\n")
    f.write(f"Klien aktif yang bisa diukur: {len(hasil)}. Belum bisa diukur: {len(kpi.TANPA_AKSES)} "
            f"(properti GSC belum dibagikan ke akun layanan).\n\n")
    f.write("## Ringkasan\n\n")
    f.write("| Klien | Klik | Tayangan | Posisi | Klik lalu | Perubahan | Kueri |\n|---|---|---|---|---|---|---|\n")
    for h in hasil:
        ubah = "" if h["klik_lalu"] is None or h["klik28"] is None else f"{h['klik28'] - h['klik_lalu']:+d}"
        f.write(f"| {h['nama']} | {h['klik28']} | {h['tayang28']} | {h['posisi28']} | "
                f"{h['klik_lalu']} | {ubah} | {h['kueri']} |\n")
    f.write("\n")
    for h in hasil:
        f.write(f"\n## {h['nama']}\n\n")
        f.write(f"- GSC 28 hari: **{h['klik28']} klik · {h['tayang28']} tayangan · posisi {h['posisi28']}** "
                f"(28 hari sebelumnya: {h['klik_lalu']} klik · {h['tayang_lalu']} tayangan · posisi {h['posisi_lalu']})\n")
        f.write(f"- Kueri yang memunculkan situs: {h['kueri']}\n")
        if h["kueri_teratas"]:
            f.write("- Kueri teratas:\n")
            for t, k, p, q in h["kueri_teratas"]:
                f.write(f"  - «{q}» — {t} tayangan, {k} klik, posisi {p}\n")
        if h["halaman_teratas"]:
            f.write("- Halaman teratas:\n")
            for t, k, u in h["halaman_teratas"][:3]:
                f.write(f"  - {u} — {t} tayangan, {k} klik\n")
        if h["kanal"]:
            f.write("- GA4 (sesi 28 hari): " + " · ".join(f"{c}: {s} sesi ({e} kejadian penting)"
                                                         for c, s, e in h["kanal"][:4]) + "\n")
        elif h["kanal_err"]:
            f.write(f"- GA4: tidak bisa dibaca ({h['kanal_err']})\n")
        if h["halaman_ga"]:
            f.write("- Halaman pendaratan GA4: " + " · ".join(f"{u} ({s})" for s, u in h["halaman_ga"][:3]) + "\n")
        if h["serp"]:
            f.write("- Posisi di Google (Serper):\n")
            for s in h["serp"]:
                f.write(f"  - «{s['kata_kunci']}» → "
                        f"{'#' + str(s['posisi']) if s['posisi'] else 'di luar 20 besar'}"
                        f" | 3 teratas: {', '.join(s['tiga_teratas'])}\n")
    f.write("\n---\n\n## Klien aktif yang belum bisa diukur\n\n")
    for nama, situs, ga4 in kpi.TANPA_AKSES:
        f.write(f"- **{nama}** ({situs}) — properti Search Console belum dibagikan ke akun layanan "
                f"`{os.path.expanduser('~/.hermes/gsc_service_account.json')}`, jadi data tayangan dan klik "
                f"belum bisa ditarik. GA4: {ga4 or 'belum ada'}.\n")
print(f"\n→ drafts/seo_semua_klien_{SEKARANG}.md + .json")
