#!/usr/bin/env python3
"""TSLaw: tarik data GSC + GA4 terkini untuk menilai keadaan situs."""
import json, time, urllib.parse, urllib.request, urllib.error
from datetime import date, timedelta

TOKEN = "/home/mantapman/.hermes/profiles/atun/workspace/seo-oauth/google_token_atun.json"
KANDIDAT_SITE = ["sc-domain:tslaw.id", "https://www.tslaw.id/", "https://tslaw.id/"]
GA4 = "properties/537990618"

from google.oauth2.credentials import Credentials
from google.auth.transport.requests import Request
c = Credentials.from_authorized_user_file(TOKEN, ["https://www.googleapis.com/auth/webmasters.readonly",
                                                 "https://www.googleapis.com/auth/analytics.readonly"])
if not c.valid:
    c.refresh(Request()); open(TOKEN, "w").write(c.to_json())
H = {"Authorization": f"Bearer {c.token}", "Content-Type": "application/json"}


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


print("=== properti GA4 yang cocok ===")
d = req("https://analyticsadmin.googleapis.com/v1beta/accountSummaries?pageSize=50")
for acc in (d.get("accountSummaries") or []):
    for p in acc.get("propertySummaries", []):
        if "tslaw" in p.get("displayName", "").lower() or p["property"].endswith("537990618"):
            print("   ", p["property"], "|", p.get("displayName"))

print("\n=== GSC: properti yang bisa dibaca untuk tslaw ===")
d = req("https://www.googleapis.com/webmasters/v3/sites")
site_terpilih = None
for s in (d.get("siteEntry") or []):
    if "tslaw" in s["siteUrl"]:
        print(f"   {s['siteUrl']}  ({s.get('permissionLevel')})")
        if site_terpilih is None and s.get("permissionLevel") in ("siteOwner", "siteFullUser", "siteRestrictedUser"):
            site_terpilih = s["siteUrl"]
if not site_terpilih:
    site_terpilih = KANDIDAT_SITE[0]
print("   dipakai:", site_terpilih)


def gsc(dim, a, b, baris=100):
    isi = {"startDate": a, "endDate": b, "dimensions": dim, "rowLimit": baris}
    d = req(f"https://www.googleapis.com/webmasters/v3/sites/{urllib.parse.quote(site_terpilih)}/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"\n=== GSC: {S(awal)} → {S(akhir)} vs {S(lalu_awal)} → {S(lalu_akhir)} ===")
for nama, (a, b) in (("28 hari terakhir", (S(awal), S(akhir))), ("28 hari sebelumnya", (S(lalu_awal), S(lalu_akhir)))):
    rows = gsc(["date"], a, b, 100)
    klik = sum(r["clicks"] for r in rows)
    tayang = sum(r["impressions"] for r in rows)
    print(f"   {nama:<20} klik {klik:>4} | tayang {tayang:>6}")

print("\n   kueri teratas (28 hari):")
rows = gsc(["query"], S(awal), S(akhir), 20)
for r in sorted(rows, key=lambda x: -x["clicks"])[:12]:
    print(f"      {r['clicks']:>3} klik | {r['impressions']:>5} tayang | pos {round(r['position'],1):>5} | {r['keys'][0][:52]}")

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

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

print("\n=== sitemap di Search Console ===")
d = req(f"https://www.googleapis.com/webmasters/v3/sites/{urllib.parse.quote(site_terpilih)}/sitemaps")
for s in (d.get("sitemap") or []):
    print(f"   {s['path'][:60]} | unduh terakhir {s.get('lastDownloaded','-')} | error {s.get('errors',0)} | warning {s.get('warnings',0)}")

print("\n=== GA4 90 hari ===")
def ga(dim, met, hari=90, limit=25, 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 = req(f"https://analyticsdata.googleapis.com/v1beta/{GA4}:runReport", isi)
    return (d or {}).get("rows", [])


for dim, met, judul in ((["sessionDefaultChannelGroup"], ["sessions", "engagementRate"], "kanal"),
                        (["landingPagePlusQueryString"], ["sessions", "keyEvents"], "halaman masuk"),
                        (["eventName"], ["eventCount"], "peristiwa")):
    print(f"\n   {judul}:")
    for r in ga(dim, met, 90, 12, "sessions" if "sessions" in met else "eventCount"):
        nilai = " | ".join(v["value"] for v in r["metricValues"])
        print(f"      {nilai:>22}  {r['dimensionValues'][0]['value'][:60]}")
