#!/usr/bin/env python3
"""StudioSoft: tarik data GSC + GA4 terkini sebagai dasar penyusunan KPI."""
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"
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 api(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=180) 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 {}


print("=== properti GSC studiosoft ===")
d = api("https://www.googleapis.com/webmasters/v3/sites")
SITE = None
for s in (d.get("siteEntry") or []):
    if "studiosoft" in s["siteUrl"]:
        print(f"   {s['siteUrl']} | {s.get('permissionLevel')}")
        if s.get("permissionLevel") == "siteOwner" and SITE is None:
            SITE = s["siteUrl"]
print("   dipakai:", SITE)
SITE_ENC = urllib.parse.quote(SITE, safe="")


def gsc(dim, a, b, baris=200, filter_grup=None):
    isi = {"startDate": a, "endDate": b, "dimensions": dim, "rowLimit": baris}
    if filter_grup:
        isi["dimensionFilterGroups"] = filter_grup
    d = api(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"\n=== GSC: {S(awal)} → {S(akhir)} vs {S(lalu_awal)} → {S(lalu_akhir)} ===")
for nama, (a, b) in (("28 hari ini", (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)
    ctr = round(klik / tayang * 100, 2) if tayang else 0
    posisi = [r["position"] for r in rows]
    print(f"   {nama:<20} klik {klik:>5} | tayang {tayang:>7} | CTR {ctr:>5}% | posisi rata2 {round(sum(posisi)/len(posisi),1) if posisi else '-'}")

print("\n=== 90 hari: pita posisi (peluang) ===")
rows90 = gsc(["query"], (akhir - timedelta(days=89)).isoformat(), S(akhir), 2000)
pita = [(1, 3), (4, 10), (11, 20), (21, 50), (51, 100)]
for lo, hi in pita:
    kl = sum(r["clicks"] for r in rows90 if lo <= r["position"] <= hi)
    ty = sum(r["impressions"] for r in rows90 if lo <= r["position"] <= hi)
    print(f"   pos {lo:>2}-{hi:<3} klik {kl:>5} | tayang {ty:>7} | CTR {round(kl/ty*100,2) if ty else 0}%")

print("\n=== 15 kueri tayangan terbanyak 90 hari ===")
for r in sorted(rows90, key=lambda x: -x["impressions"])[:15]:
    print(f"   {r['clicks']:>3} klik | {r['impressions']:>6} tayang | pos {round(r['position'],1):>6} | {r['keys'][0][:56]}")

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

print("\n=== sitemap & perangkat ===")
d = api(f"https://www.googleapis.com/webmasters/v3/sites/{SITE_ENC}/sitemaps")
for s in (d.get("sitemap") or [])[:6]:
    print(f"   {s['path'].replace('https://studiosoft.id','')[:40]:<42} unduh {str(s.get('lastDownloaded'))[:10]} | error {s.get('errors',0)}")
for r in gsc(["device"], S(awal), S(akhir), 5):
    print(f"   {r['keys'][0]:<8} klik {r['clicks']:>4} | tayang {r['impressions']:>6}")

print("\n=== GA4 ===")
d = api("https://analyticsadmin.googleapis.com/v1beta/accountSummaries?pageSize=50")
props = []
for acc in (d.get("accountSummaries") or []):
    for p in acc.get("propertySummaries", []):
        if "studiosoft" in p.get("displayName", "").lower():
            props.append((p["property"], p.get("displayName")))
print("   properti ditemukan:", props)
for prop, nama in props:
    st, isi = 200, {}
    print(f"\n   -- {nama} ({prop})")
    isi = api(f"https://analyticsdata.googleapis.com/v1beta/{prop}:runReport",
              {"dateRanges": [{"startDate": "90daysAgo", "endDate": "today"}],
               "dimensions": [{"name": "sessionDefaultChannelGroup"}],
               "metrics": [{"name": "sessions"}, {"name": "engagementRate"}, {"name": "keyEvents"}],
               "limit": 10, "orderBys": [{"metric": {"metricName": "sessions"}, "desc": True}]})
    for r in (isi.get("rows", []) if isinstance(isi, dict) else []):
        print(f"      {r['dimensionValues'][0]['value']:<24} {r['metricValues'][0]['value']:>5} sesi | "
              f"keterlibatan {round(float(r['metricValues'][1]['value'])*100)}% | kunci {r['metricValues'][2]['value']}")
