#!/usr/bin/env python3
"""Cari properti GA4 yang kota teratasnya 'Flint Hill' + bongkar asal trafiknya."""
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"])
admin = build("analyticsadmin", "v1beta", credentials=creds, cache_discovery=False)
data = build("analyticsdata", "v1beta", credentials=creds, cache_discovery=False)

PROPS = []
for acc in admin.accounts().list().execute().get("accounts", []):
    for p in admin.properties().list(filter=f"parent:{acc['name']}").execute().get("properties", []):
        PROPS.append(p)

e = date.today() - timedelta(days=1)
a, b = (e - timedelta(days=27)).isoformat(), e.isoformat()

KANDIDAT = []
print("=== kota teratas per properti (28 hari) ===")
for p in PROPS:
    if "Keyword Hero" in p.get("displayName", ""):
        continue
    try:
        r = data.properties().runReport(property=p["name"], body={
            "dateRanges": [{"startDate": a, "endDate": b}],
            "dimensions": [{"name": "city"}], "metrics": [{"name": "sessions"}],
            "orderBys": [{"metric": {"metricName": "sessions"}, "desc": True}], "limit": 4}).execute()
        kota = [(x["dimensionValues"][0]["value"], x["metricValues"][0]["value"]) for x in r.get("rows", [])]
        tanda = "  ← ADA FLINT HILL" if any("flint" in k[0].lower() for k in kota) else ""
        print(f"  {p.get('displayName')[:28]:<30} {kota}{tanda}")
        if tanda:
            KANDIDAT.append(p)
    except Exception as ex:
        print(f"  {p.get('displayName')[:28]:<30} error {str(ex)[:60]}")

if not KANDIDAT:
    print("\nTidak ada properti yang memuat 'Flint Hill' di 28 hari terakhir.")
    raise SystemExit(0)

P = KANDIDAT[0]
print(f"\n=== BONGKAR: {P.get('displayName')} ({P['name']}) ===")


def rep(dims, mets, limit=12, extra=None):
    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}
    if extra:
        body.update(extra)
    return data.properties().runReport(property=P["name"], body=body).execute().get("rows", [])


print("\n-- Flint Hill: dari mana datangnya? --")
for x in rep(["city", "sessionSourceMedium"], ["sessions", "userEngagementDuration"]):
    if "flint" in x["dimensionValues"][0]["value"].lower():
        print(f"   {x['dimensionValues'][1]['value']:<32} sesi {x['metricValues'][0]['value']:>4} | engagement {float(x['metricValues'][1]['value']):.0f}s")

print("\n-- Flint Hill: perangkat & browser --")
for x in rep(["city", "deviceCategory", "browser"], ["sessions"]):
    if "flint" in x["dimensionValues"][0]["value"].lower():
        print(f"   {x['dimensionValues'][1]['value']:<8} {x['dimensionValues'][2]['value']:<14} sesi {x['metricValues'][0]['value']}")

print("\n-- Flint Hill: halaman yang dibuka --")
for x in rep(["city", "landingPagePlusQueryString"], ["sessions"]):
    if "flint" in x["dimensionValues"][0]["value"].lower():
        print(f"   {x['metricValues'][0]['value']:>4} sesi | {x['dimensionValues'][1]['value'][:66]}")

print("\n-- Flint Hill: kualitas trafiknya --")
for x in rep(["city"], ["sessions", "totalUsers", "engagementRate", "averageSessionDuration", "screenPageViews"]):
    if "flint" in x["dimensionValues"][0]["value"].lower():
        v = [m["value"] for m in x["metricValues"]]
        print(f"   sesi {v[0]} | user {v[1]} | engagement {float(v[2])*100:.1f}% | durasi {float(v[3]):.0f}s | pageview {v[4]}")

print("\n-- 10 kota teratas (pembanding) --")
for x in rep(["city"], ["sessions", "engagementRate"]):
    print(f"   {x['dimensionValues'][0]['value'][:28]:<30} sesi {x['metricValues'][0]['value']:>4} | engagement {float(x['metricValues'][1]['value'])*100:>5.1f}%")
