#!/usr/bin/env python3
"""DAS: tarik data lanjutan untuk mencari peluang optimasi dari GSC, GA4, dan Google Ads (lewat GA4)."""
import json, time, urllib.parse, urllib.request, urllib.error
from collections import defaultdict

WS = "/home/mantapman/.hermes/profiles/atun/workspace"
TOKEN = "/home/mantapman/.hermes/profiles/suwarno/workspace/seo-oauth/google_token_seo.json"
SITE = "sc-domain:dasindonesia.com"
GA4 = "properties/443064659"

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:
            print("   HTTP", e.code, e.read().decode()[:130])
            return None
        except Exception as e:
            time.sleep(3)
    return None


def gsc(dim, a, b, baris=500, saring=None):
    isi = {"startDate": a, "endDate": b, "dimensions": dim, "rowLimit": baris}
    if saring:
        isi["dimensionFilterGroups"] = [{"filters": saring}]
    d = req(f"https://www.googleapis.com/webmasters/v3/sites/{urllib.parse.quote(SITE)}/searchAnalytics/query", isi)
    return (d or {}).get("rows", [])


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


def amb(v, i):
    return v["metricValues"][i]["value"]


hasil = {}
A, B = "2026-08-30", "2026-09-26"

print("=== GSC: kueri × halaman (kueri mendarat di mana) ===")
qp = gsc(["query", "page"], A, B, 200)
hasil["kueri_halaman"] = [{"q": x["keys"][0], "u": x["keys"][1].replace("https://dasindonesia.com", ""),
                           "klik": x["clicks"], "tayang": x["impressions"], "pos": round(x["position"], 1)} for x in qp]
for x in hasil["kueri_halaman"][:1]:
    print("   contoh:", x)

print("\n=== GSC: pita posisi (peluang CTR) ===")
pita = [(1, 3), (4, 10), (11, 20), (21, 50), (51, 100)]
hasil["pita"] = []
for lo, hi in pita:
    rows = gsc(["query"], A, B, 500)
    kl = sum(r["clicks"] for r in rows if lo <= r["position"] <= hi)
    ty = sum(r["impressions"] for r in rows if lo <= r["position"] <= hi)
    hasil["pita"].append({"pita": f"{lo}-{hi}", "klik": kl, "tayang": ty,
                          "ctr": round(kl / ty * 100, 1) if ty else 0})
    print(f"   posisi {lo:>2}-{hi:<3} klik {kl:>4} | tayang {ty:>6} | CTR {hasil['pita'][-1]['ctr']}%")

print("\n=== GSC: kueri tayang banyak tapi CTR rendah ===")
rows = gsc(["query"], A, B, 500)
lemah = [r for r in rows if r["impressions"] >= 15 and r["clicks"] / max(r["impressions"], 1) < 0.02]
lemah.sort(key=lambda r: -r["impressions"])
hasil["ctr_lemah"] = [{"q": r["keys"][0], "tayang": r["impressions"], "klik": r["clicks"],
                       "pos": round(r["position"], 1)} for r in lemah[:25]]
for x in hasil["ctr_lemah"][:12]:
    print(f"   {x['tayang']:>5} tayang | {x['klik']} klik | pos {x['pos']:>5} | {x['q'][:52]}")

print("\n=== GSC: halaman teratas 90 hari (siapa yang masih berdiri) ===")
rows90 = gsc(["page"], "2026-07-01", B, 100)
hasil["halaman_90"] = [{"u": r["keys"][0].replace("https://dasindonesia.com", ""), "klik": r["clicks"],
                        "tayang": r["impressions"], "pos": round(r["position"], 1)} for r in rows90]
for x in sorted(hasil["halaman_90"], key=lambda y: -y["klik"])[:14]:
    print(f"   {x['klik']:>3} klik | {x['tayang']:>5} tayang | pos {x['pos']:>5} | {x['u'][:56]}")

print("\n=== GA4: kanal + keterlibatan ===")
rows = ga(["sessionDefaultChannelGroup"], ["sessions", "engagementRate", "averageSessionDuration", "keyEvents"], 90, 20, "sessions")
hasil["kanal_ket"] = []
for r in rows:
    d = {"k": r["dimensionValues"][0]["value"], "sesi": int(amb(r, 0)),
         "keterlibatan": round(float(amb(r, 1)) * 100, 1), "durasi": round(float(amb(r, 2))),
         "peristiwa_kunci": float(amb(r, 3))}
    hasil["kanal_ket"].append(d)
    print(f"   {d['k']:<26} sesi {d['sesi']:>5} | keterlibatan {d['keterlibatan']:>5}% | rata-rata {d['durasi']:>4}s | peristiwa kunci {d['peristiwa_kunci']}")

print("\n=== GA4: kampanye (jejak Google Ads) ===")
rows = ga(["sessionCampaignName"], ["sessions", "keyEvents"], 90, 25, "sessions")
hasil["kampanye"] = []
for r in rows:
    d = {"k": r["dimensionValues"][0]["value"], "sesi": int(amb(r, 0)), "peristiwa_kunci": float(amb(r, 1))}
    hasil["kampanye"].append(d)
    if d["k"] not in ("(organic)", "(referral)", "(not set)"):
        print(f"   {d['k'][:56]:<58} sesi {d['sesi']:>4} | peristiwa kunci {d['peristiwa_kunci']}")

print("\n=== GA4: halaman masuk + kualitas ===")
rows = ga(["landingPagePlusQueryString"], ["sessions", "engagementRate", "averageSessionDuration", "keyEvents"], 90, 30, "sessions")
hasil["halaman_masuk"] = []
for r in rows:
    d = {"u": r["dimensionValues"][0]["value"].replace("https://dasindonesia.com", ""), "sesi": int(amb(r, 0)),
         "keterlibatan": round(float(amb(r, 1)) * 100, 1), "durasi": round(float(amb(r, 2))), "kunci": float(amb(r, 3))}
    hasil["halaman_masuk"].append(d)
    print(f"   {d['sesi']:>4} sesi | {d['keterlibatan']:>5}% | {d['durasi']:>4}s | kunci {d['kunci']:>4} | {d['u'][:52]}")

print("\n=== GA4: perangkat ===")
rows = ga(["deviceCategory"], ["sessions", "engagementRate", "keyEvents"], 90, 10, "sessions")
hasil["perangkat"] = []
for r in rows:
    d = {"k": r["dimensionValues"][0]["value"], "sesi": int(amb(r, 0)),
         "keterlibatan": round(float(amb(r, 1)) * 100, 1), "kunci": float(amb(r, 2))}
    hasil["perangkat"].append(d)
    print(f"   {d['k']:<10} sesi {d['sesi']:>5} | keterlibatan {d['keterlibatan']:>5}% | peristiwa kunci {d['kunci']}")

print("\n=== GA4: peristiwa kunci (konversi) ===")
rows = ga(["eventName"], ["eventCount", "totalUsers"], 90, 40, "eventCount")
hasil["peristiwa"] = [{"e": r["dimensionValues"][0]["value"], "n": int(amb(r, 0)), "pengguna": int(amb(r, 1))} for r in rows]
for x in hasil["peristiwa"][:16]:
    print(f"   {x['n']:>5}x | {x['pengguna']:>5} pengguna | {x['e'][:56]}")

print("\n=== GA4: kota (organik, Indonesia) ===")
rows = ga(["city"], ["sessions", "keyEvents"], 90, 20, "sessions")
hasil["kota"] = [{"k": r["dimensionValues"][0]["value"], "sesi": int(amb(r, 0)), "kunci": float(amb(r, 1))} for r in rows]
for x in hasil["kota"][:12]:
    print(f"   {x['sesi']:>4} sesi | kunci {x['kunci']} | {x['k']}")

json.dump(hasil, open(f"{WS}/drafts/das_data_lanjutan_20260929.json", "w"), indent=1, ensure_ascii=False)
print(f"\n→ drafts/das_data_lanjutan_20260929.json")
