#!/usr/bin/env python3
"""Kenapa trafik Surabaya/Malang sedikit: pisahkan manusia vs bot, lokal vs non-lokal."""
import os
from datetime import date, timedelta
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/analytics.readonly",
            "https://www.googleapis.com/auth/webmasters.readonly"])
data = build("analyticsdata", "v1beta", credentials=creds, cache_discovery=False)
gsc = build("webmasters", "v3", credentials=creds, cache_discovery=False)
P = "properties/478760195"
S = "https://studiosoft.id/"
e = date.today() - timedelta(days=1)
a, b = (e - timedelta(days=27)).isoformat(), e.isoformat()
g90a, g90b = (e - timedelta(days=88)).isoformat(), e.isoformat()


def rep(dims, mets, limit=50):
    body = {"dateRanges": [{"startDate": a, "endDate": b}],
            "dimensions": [{"name": d} for d in dims],
            "metrics": [{"name": m} for m in mets],
            "orderBys": [{"metric": {"metricName": mets[0]}, "desc": True}], "limit": limit}
    return data.properties().runReport(property=P, body=body).execute().get("rows", [])


print("=== GA4 28d: sesi per NEGARA ===")
for x in rep(["country"], ["sessions"]):
    print(f"   {x['dimensionValues'][0]['value']:<22} {x['metricValues'][0]['value']}")

print("\n=== GA4 28d: sesi per KOTA (Indonesia saja) ===")
ID = {"surabaya", "malang", "jakarta", "sidoarjo", "semarang", "bandung", "gresik", "kediri", "medan", "yogyakarta",
      "denpasar", "makassar", "tangerang", "bekasi", "depok", "bogor", "solo", "balikpapan", "kudus", "blitar",
      "jember", "mojokerto", "pasuruan", "probolinggo", "madiun", "tuban", "lamongan", "bangkalan", "samarinda",
      "pontianak", "manado", "palembang", "pekanbaru", "padang", "bandar lampung", "batam", "cirebon", "tasikmalaya"}
tot_id = tot_dc = 0
dc_rows = []
for x in rep(["city"], ["sessions", "screenPageViews", "averageSessionDuration"]):
    nama = x["dimensionValues"][0]["value"].lower()
    s = int(x["metricValues"][0]["value"])
    if nama in ID:
        tot_id += s
        print(f"   {x['dimensionValues'][0]['value']:<18} sesi {s:>4} | halaman/sesi {float(x['metricValues'][1]['value'])/s:.2f} | durasi {float(x['metricValues'][2]['value']):.0f}s")
    else:
        tot_dc += s
        dc_rows.append((x["dimensionValues"][0]["value"], s))
print(f"\n   TOTAL kota Indonesia : {tot_id} sesi")
print(f"   TOTAL kota luar/datacenter/(not set): {tot_dc} sesi")

print("\n=== GSC 90d: query LOKAL vs NON-LOKAL ===")
rows = gsc.searchanalytics().query(siteUrl=S, body={"startDate": g90a, "endDate": g90b, "dimensions": ["query"],
                                                    "rowLimit": 5000}).execute().get("rows", [])
KOTA = ("surabaya", "sidoarjo", "malang", "gresik", "mojokerto", "pasuruan", "jakarta", "bandung", "semarang",
        "jawa timur", "jember", "kediri", "bali", "denpasar")
lokal = [r for r in rows if any(k in r["keys"][0].lower() for k in KOTA)]
non = [r for r in rows if r not in lokal]


def agg(rs):
    c = sum(r["clicks"] for r in rs); i = sum(r["impressions"] for r in rs)
    p = sum(r["position"] * r["impressions"] for r in rs) / i if i else 0
    return len(rs), i, c, p


for nama, grp in (("LOKAL (ada nama kota)", lokal), ("NON-LOKAL", non)):
    n, i, c, p = agg(grp)
    print(f"   {nama:<24} {n:>4} query | {int(i):>6} impresi | {int(c):>4} klik | CTR {c/i*100 if i else 0:>5.2f}% | pos {p:>5.1f}")

print("\n=== GSC 90d: query yang mengandung 'surabaya' ===")
for r in sorted(lokal, key=lambda x: -x["impressions"])[:12]:
    print(f"   {int(r['impressions']):>5} imp | {int(r['clicks'])} klik | pos {r['position']:>5.1f} | {r['keys'][0]}")

print("\n=== GSC 90d: negara & perangkat ===")
for dim in ("country", "device"):
    for x in gsc.searchanalytics().query(siteUrl=S, body={"startDate": g90a, "endDate": g90b, "dimensions": [dim],
                                                          "rowLimit": 6}).execute().get("rows", []):
        print(f"   [{dim}] {x['keys'][0]:<14} {int(x['impressions']):>6} imp | {int(x['clicks']):>4} klik | pos {x['position']:.1f}")
