#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""Permintaan nyata studiosoft.id: GSC (OAuth token) + GA4 (service account, property 478760195).
Simpan -> /tmp/ss_demand.json. Read-only."""
import json, os
from datetime import date, timedelta
from google.oauth2.service_account import Credentials as SACreds
from google.oauth2.credentials import Credentials as OAuthCreds
from googleapiclient.discovery import build

WS = os.path.dirname(os.path.abspath(__file__))
TOK = os.path.join(WS, "seo-oauth", "google_token_atun.json")
t = json.load(open(TOK))
g_creds = OAuthCreds(**{k: t[k] for k in ("token", "refresh_token", "token_uri",
                                          "client_id", "client_secret")}, scopes=t.get("scopes"))
gsc = build("webmasters", "v3", credentials=g_creds, cache_discovery=False)

KEY = os.path.expanduser("~/.hermes/gsc_service_account.json")
ga_creds = SACreds.from_service_account_file(
    KEY, scopes=["https://www.googleapis.com/auth/analytics.readonly"])
ga = build("analyticsdata", "v1beta", credentials=ga_creds, cache_discovery=False)

SITE = "sc-domain:studiosoft.id"
PROP = "properties/478760195"
END = date.today() - timedelta(days=2)
START = END - timedelta(days=89)
out = {"rentang": [START.isoformat(), END.isoformat()]}

for dim, key, lim in (("query", "queries", 1000), ("page", "pages", 500)):
    r = gsc.searchanalytics().query(siteUrl=SITE, body={
        "startDate": START.isoformat(), "endDate": END.isoformat(),
        "dimensions": [dim], "rowLimit": lim}).execute()
    out.setdefault("gsc", {})[key] = [
        {"k": x["keys"][0], "clicks": x["clicks"], "imp": x["impressions"],
         "ctr": round(x["ctr"] * 100, 2), "pos": round(x["position"], 1)}
        for x in r.get("rows", [])]
    print(f"GSC {key}: {len(out['gsc'][key])} baris")

try:
    r = ga.properties().runReport(property=PROP, body={
        "dateRanges": [{"startDate": START.isoformat(), "endDate": END.isoformat()}],
        "dimensions": [{"name": "landingPagePlusQueryString"}],
        "metrics": [{"name": "sessions"}, {"name": "totalUsers"}, {"name": "keyEvents"}],
        "orderBys": [{"metric": {"metricName": "sessions"}, "desc": True}], "limit": 60}).execute()
    out["ga4_halaman"] = [
        {"k": x["dimensionValues"][0]["value"], "sesi": int(x["metricValues"][0]["value"]),
         "user": int(x["metricValues"][1]["value"]), "konversi": round(float(x["metricValues"][2]["value"]), 1)}
        for x in r.get("rows", [])]
    print(f"GA4 halaman: {len(out['ga4_halaman'])} baris")

    r = ga.properties().runReport(property=PROP, body={
        "dateRanges": [{"startDate": START.isoformat(), "endDate": END.isoformat()}],
        "dimensions": [{"name": "sessionDefaultChannelGroup"}],
        "metrics": [{"name": "sessions"}, {"name": "keyEvents"}],
        "orderBys": [{"metric": {"metricName": "sessions"}, "desc": True}]}).execute()
    out["ga4_kanal"] = [
        {"k": x["dimensionValues"][0]["value"], "sesi": int(x["metricValues"][0]["value"]),
         "konversi": round(float(x["metricValues"][1]["value"]), 1)} for x in r.get("rows", [])]
    print("GA4 kanal:", out["ga4_kanal"])
except Exception as e:
    print("GA4 error:", str(e)[:200])

json.dump(out, open("/tmp/ss_demand.json", "w"), ensure_ascii=False, indent=1)

print("\n=== GSC HALAMAN (klik terbanyak) ===")
for x in sorted(out["gsc"]["pages"], key=lambda y: -y["clicks"])[:20]:
    print(f"  klik={x['clicks']:4.0f} imp={x['imp']:6.0f} pos={x['pos']:5.1f}  {x['k'][:80]}")
print("\n=== GA4 HALAMAN (sesi terbanyak) ===")
for x in (out.get("ga4_halaman") or [])[:25]:
    print(f"  sesi={x['sesi']:5} user={x['user']:5} konv={x['konversi']:6.1f}  {x['k'][:70]}")
print("\n-> /tmp/ss_demand.json")
