#!/usr/bin/env python3
"""DAS: tarik data SEO terkini — GSC (kueri, halaman, perangkat, brand vs non-brand) + GA4 (kanal, halaman masuk, konversi)."""
import json, os, time, urllib.request, urllib.error, importlib.util
from collections import defaultdict

WS = "/home/mantapman/.hermes/profiles/atun/workspace"
SCOPES = ["https://www.googleapis.com/auth/webmasters.readonly",
          "https://www.googleapis.com/auth/analytics.readonly"]
TOKEN = "/home/mantapman/.hermes/profiles/suwarno/workspace/seo-oauth/google_token_seo.json"
SITE = "sc-domain:dasindonesia.com"
GA4 = "properties/443064659"
HARI = 28


def token():
    from google.oauth2.credentials import Credentials
    from google.auth.transport.requests import Request
    c = Credentials.from_authorized_user_file(TOKEN, SCOPES)
    if not c.valid:
        c.refresh(Request())
        open(TOKEN, "w").write(c.to_json())
    return c.token


TK = token()
H = {"Authorization": f"Bearer {TK}", "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()[:150])
            return None
        except Exception as e:
            time.sleep(3)
    return None


def gsc(dim, mulai, akhir, baris=100, saring=None):
    isi = {"startDate": mulai, "endDate": akhir, "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", [])


import urllib.parse
from datetime import date, timedelta

akhir = date.today() - timedelta(days=3)
awal = akhir - timedelta(days=HARI - 1)
akhir_lalu = awal - timedelta(days=1)
awal_lalu = akhir_lalu - timedelta(days=HARI - 1)
S = lambda d: d.isoformat()
tgl = {"ini": (S(awal), S(akhir)), "lalu": (S(awal_lalu), S(akhir_lalu))}
print(f"periode ini : {tgl['ini'][0]} → {tgl['ini'][1]}")
print(f"periode lalu: {tgl['lalu'][0]} → {tgl['lalu'][1]}")

hasil = {"periode": tgl}
for nama, (a, b) in tgl.items():
    q = gsc(["query"], a, b, 200)
    p = gsc(["page"], a, b, 200)
    d = gsc(["device"], a, b, 10)
    tot = gsc(["date"], a, b, 100)
    hasil[nama] = {
        "klik": sum(x["clicks"] for x in tot), "tayang": sum(x["impressions"] for x in tot),
        "kueri": [{"k": x["keys"][0], "klik": x["clicks"], "tayang": x["impressions"], "pos": round(x["position"], 1)} for x in q],
        "halaman": [{"u": x["keys"][0], "klik": x["clicks"], "tayang": x["impressions"], "pos": round(x["position"], 1)} for x in p],
        "perangkat": [{"k": x["keys"][0], "klik": x["clicks"], "tayang": x["impressions"]} for x in d]}
    print(f"   {nama}: {hasil[nama]['klik']} klik / {hasil[nama]['tayang']} tayang")

# brand vs non-brand
BRAND = ["das", "dasindonesia", "das indonesia", "bengkel das", "das bengkel"]
for nama, (a, b) in tgl.items():
    bb = 0; bn = 0
    for x in hasil[nama]["kueri"]:
        if any(t in x["k"].lower() for t in BRAND):
            bb += x["klik"]
        else:
            bn += x["klik"]
    hasil[nama]["klik_brand"], hasil[nama]["klik_nonbrand"] = bb, bn

print("\n=== GA4 90 hari ===")
GA = f"https://analyticsdata.googleapis.com/v1beta/{GA4}:runReport"


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(GA, isi)
    return (d or {}).get("rows", [])


kanal = ga(["sessionDefaultChannelGroup"], ["sessions", "totalUsers"], urut="sessions")
lp = ga(["landingPagePlusQueryString"], ["sessions", "totalUsers"], limit=25, urut="sessions")
konv = ga(["eventName"], ["eventCount"], limit=25, urut="eventCount")
hasil["ga4"] = {
    "per_kanal": [{"k": x["dimensionValues"][0]["value"], "sesi": int(x["metricValues"][0]["value"]),
                   "pengguna": int(x["metricValues"][1]["value"])} for x in kanal],
    "halaman_masuk": [{"u": x["dimensionValues"][0]["value"], "sesi": int(x["metricValues"][0]["value"])} for x in lp],
    "peristiwa": [{"e": x["dimensionValues"][0]["value"], "n": int(x["metricValues"][0]["value"])} for x in konv]}
print("   kanal:")
for k in hasil["ga4"]["per_kanal"]:
    print(f"      {k['k']:<28} {k['sesi']:>5} sesi")
print("   peristiwa teratas:")
for e in hasil["ga4"]["peristiwa"][:8]:
    print(f"      {e['e']:<32} {e['n']}")

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