#!/usr/bin/env python3
"""TSLaw: rincian GSC (kueri, halaman, perangkat, tren) + GA4, dengan penyandian URL yang benar."""
import json, urllib.parse, urllib.request, urllib.error
from datetime import date, timedelta

TOKEN = "/home/mantapman/.hermes/profiles/atun/workspace/seo-oauth/google_token_atun.json"
GA4 = "properties/537990618"
SITE = "https://www.tslaw.id/"
SITE_ENC = urllib.parse.quote(SITE, safe="")

from google.oauth2.credentials import Credentials
from google.auth.transport.requests import Request
c = Credentials.from_authorized_user_file(TOKEN)
if c.expired and c.refresh_token:
    c.refresh(Request()); open(TOKEN, "w").write(c.to_json())
H = {"Authorization": f"Bearer {c.token}", "Content-Type": "application/json"}


def panggil(u, data=None):
    r = urllib.request.Request(u, headers=H, data=json.dumps(data).encode() if data else None)
    for _ in range(3):
        try:
            with urllib.request.urlopen(r, timeout=150) as x:
                return json.loads(x.read())
        except urllib.error.HTTPError as e:
            return {"err": e.code, "pesan": e.read().decode()[:150]}
        except Exception:
            import time; time.sleep(3)
    return {}


def gsc(dim, a, b, baris=50):
    isi = {"startDate": a, "endDate": b, "dimensions": dim, "rowLimit": baris}
    d = panggil(f"https://www.googleapis.com/webmasters/v3/sites/{SITE_ENC}/searchAnalytics/query", isi)
    return (d or {}).get("rows", [])


akhir = date.today() - timedelta(days=3)
awal = akhir - timedelta(days=27)
lalu_akhir = awal - timedelta(days=1)
lalu_awal = lalu_akhir - timedelta(days=27)
S = lambda x: x.isoformat()

print(f"=== perbandingan ({S(awal)}→{S(akhir)} vs {S(lalu_awal)}→{S(lalu_akhir)}) ===")
for nama, (a, b) in (("28 hari terakhir", (S(awal), S(akhir))), ("28 sebelumnya", (S(lalu_awal), S(lalu_akhir)))):
    rows = gsc(["date"], a, b, 60)
    print(f"   {nama:<16} klik {sum(r['clicks'] for r in rows):>4} | tayang {sum(r['impressions'] for r in rows):>6}")

print("\n=== kueri 28 hari (semua yang muncul) ===")
for r in sorted(gsc(["query"], S(awal), S(akhir), 40), key=lambda x: -x["impressions"]):
    print(f"   {r['clicks']:>2} klik | {r['impressions']:>4} tayang | pos {round(r['position'],1):>5} | {r['keys'][0][:60]}")

print("\n=== halaman 28 hari ===")
for r in sorted(gsc(["page"], S(awal), S(akhir), 40), key=lambda x: -x["impressions"]):
    print(f"   {r['clicks']:>2} klik | {r['impressions']:>4} tayang | pos {round(r['position'],1):>5} | {r['keys'][0].replace('https://www.tslaw.id','')[:56]}")

print("\n=== perangkat & negara 28 hari ===")
for r in gsc(["device"], S(awal), S(akhir), 5):
    print(f"   {r['keys'][0]:<8} klik {r['clicks']:>2} | tayang {r['impressions']:>4}")
for r in gsc(["country"], S(awal), S(akhir), 6):
    print(f"   {r['keys'][0]:<6} klik {r['clicks']:>2} | tayang {r['impressions']:>4}")

print("\n=== sitemap yang terdaftar ===")
d = panggil(f"https://www.googleapis.com/webmasters/v3/sites/{SITE_ENC}/sitemaps")
for s in (d.get("sitemap") or []):
    print(f"   {s['path'].replace('https://www.tslaw.id',''):<28} unduh terakhir {s.get('lastDownloaded','-')[:10]} | error {s.get('errors',0)} | dikirim {s.get('contents',[{}])[0].get('submitted','?')}")

print("\n=== GA4 90 hari: kanal, konversi ===")
def ga(dim, met, hari=90, limit=20, urut=None):
    isi = {"dateRanges": [{"startDate": f"{hari}daysAgo", "endDate": "today"}],
           "dimensions": [{"name": d} for d in dim], "metrics": [{"name": m} for m in met], "limit": limit}
    if urut:
        isi["orderBys"] = [{"metric": {"metricName": urut}, "desc": True}]
    d = panggil(f"https://analyticsdata.googleapis.com/v1beta/{GA4}:runReport", isi)
    return (d or {}).get("rows", [])

tot = 0
for r in ga(["sessionDefaultChannelGroup"], ["sessions", "engagementRate", "keyEvents"], urut="sessions"):
    sesi = int(r["metricValues"][0]["value"]); tot += sesi
    print(f"   {r['dimensionValues'][0]['value']:<22} {sesi:>4} sesi | keterlibatan {round(float(r['metricValues'][1]['value'])*100)}% | peristiwa kunci {r['metricValues'][2]['value']}")
print(f"   TOTAL: {tot} sesi / 90 hari")

print("\n   peristiwa penting:")
for r in ga(["eventName"], ["eventCount"], limit=30, urut="eventCount"):
    if r["dimensionValues"][0]["value"] in ("click", "contact_link_click", "form_submit", "generate_lead",
                                            "whatsapp_click", "page_view", "session_start"):
        print(f"      {r['metricValues'][0]['value']:>6}x {r['dimensionValues'][0]['value']}")
