#!/usr/bin/env python3
"""TSLaw: cocokkan keyphrase dengan data GA4 (kanal organik, halaman pendaratan, kota, perangkat) + GSC per halaman."""
import os, urllib.request
from google.oauth2 import service_account
from googleapiclient.discovery import build

KEY = os.path.expanduser("~/.hermes/gsc_service_account.json")
PROP = "properties/537990618"
SC = ["https://www.googleapis.com/auth/analytics.readonly"]

ga = build("analyticsdata", "v1beta",
           credentials=service_account.Credentials.from_service_account_file(KEY, scopes=SC), cache_discovery=False)
gsc = build("searchconsole", "v1",
            credentials=service_account.Credentials.from_service_account_file(
                KEY, scopes=["https://www.googleapis.com/auth/webmasters.readonly"]), cache_discovery=False)
MULAI, AKHIR = "2026-06-28", "2026-09-25"


def rep(dims, mets, limit=15, urut=None, kanal=None):
    b = {"dateRanges": [{"startDate": MULAI, "endDate": AKHIR}],
         "dimensions": [{"name": d} for d in dims],
         "metrics": [{"name": m} for m in mets], "limit": limit}
    if urut:
        b["orderBys"] = [{"metric": {"metricName": urut}, "desc": True}]
    if kanal:
        b["dimensionFilter"] = {"filter": {"fieldName": "sessionDefaultChannelGroup",
                                           "stringFilter": {"value": kanal, "matchType": "EXACT"}}}
    return ga.properties().runReport(property=PROP, body=b).execute().get("rows", [])


print("=== 1. GA4 — halaman pendaratan dari ORGANIC SEARCH (90 hari) ===")
for row in rep(["landingPagePlusQueryString"], ["sessions", "totalUsers", "userEngagementDuration"], 15, "sessions", "Organic Search"):
    lp = row["dimensionValues"][0]["value"]; v = [x["value"] for x in row["metricValues"]]
    print(f"   sesi {v[0]:>4} | pengguna {v[1]:>4} | {round(float(v[2])/max(int(v[0]),1)):>4}s | {lp[:58]}")

print("\n=== 2. GA4 — kota dari ORGANIC SEARCH ===")
for row in rep(["city"], ["sessions", "averageSessionDuration"], 10, "sessions", "Organic Search"):
    d = row["dimensionValues"][0]["value"]; v = [x["value"] for x in row["metricValues"]]
    print(f"   {d[:26]:<28} sesi {v[0]:>4} | durasi {round(float(v[1]))}s")

print("\n=== 3. GA4 — perangkat & kanal ===")
for dim in ("deviceCategory", "sessionDefaultChannelGroup"):
    for row in rep([dim], ["sessions", "engagementRate"], 8, "sessions"):
        d = row["dimensionValues"][0]["value"]; v = [x["value"] for x in row["metricValues"]]
        print(f"   {dim[:16]:<18} {d[:22]:<24} sesi {v[0]:>4} | engagement {round(float(v[1])*100)}%")

print("\n=== 4. GSC — query yang mendarat di BERANDA (90 hari) ===")
rows = gsc.searchanalytics().query(siteUrl="https://www.tslaw.id/", body={
    "startDate": MULAI, "endDate": AKHIR, "dimensions": ["query", "page"], "rowLimit": 5000}).execute().get("rows", [])
beranda = [r for r in rows if r["keys"][1].rstrip("/") in ("https://www.tslaw.id", "https://tslaw.id")]
beranda.sort(key=lambda r: -r["impressions"])
total = sum(r["impressions"] for r in beranda)
print(f"   {len(beranda)} query | {total} impresi | {sum(r['clicks'] for r in beranda)} klik")
for r in beranda[:14]:
    print(f"   imp {r['impressions']:>4} | klik {r['clicks']:>2} | pos {round(r['position'],1):>5} | {r['keys'][0][:56]}")

print("\n=== 5. ringkasan semua halaman (GSC) ===")
halaman = {}
for r in rows:
    pg = r["keys"][1].replace("https://www.tslaw.id", "")
    d = halaman.setdefault(pg, {"imp": 0, "klik": 0, "pos": []})
    d["imp"] += r["impressions"]; d["klik"] += r["clicks"]; d["pos"].append((r["impressions"], r["position"]))
print(f"   {'halaman':<52} {'imp':>5} {'klik':>5} {'pos':>6}")
for pg, d in sorted(halaman.items(), key=lambda x: -x[1]["imp"])[:12]:
    pos = sum(p * i for i, p in d["pos"]) / d["imp"]
    print(f"   {pg[:52]:<54} {d['imp']:>5} {d['klik']:>5} {round(pos,1):>6}")
