#!/usr/bin/env python3
"""StudioSoft: peta kekuatan SEO dari GSC + GA4 (data asli, 90 & 28 hari)."""
import os, re, json
from datetime import date, timedelta
from google.oauth2 import service_account
from googleapiclient.discovery import build

SA = os.path.expanduser("~/.hermes/gsc_service_account.json")
creds = service_account.Credentials.from_service_account_file(
    SA, scopes=["https://www.googleapis.com/auth/webmasters.readonly",
                "https://www.googleapis.com/auth/analytics.readonly"])
gsc = build("webmasters", "v3", credentials=creds, cache_discovery=False)
data = build("analyticsdata", "v1beta", credentials=creds, cache_discovery=False)
S = "https://studiosoft.id/"
PROP = "properties/478760195"
e = date.today() - timedelta(days=2)
S90, S28, END = (e - timedelta(days=89)).isoformat(), (e - timedelta(days=27)).isoformat(), e.isoformat()


def q(body):
    return gsc.searchanalytics().query(siteUrl=S, body=body).execute().get("rows", [])


def rep(body):
    return data.properties().runReport(property=PROP, body=body).execute().get("rows", [])


tot90 = q({"startDate": S90, "endDate": END, "dimensions": [], "rowLimit": 1})
tot28 = q({"startDate": S28, "endDate": END, "dimensions": [], "rowLimit": 1})
print("=== TOTALS ===")
for label, t in (("90d", tot90), ("28d", tot28)):
    if t:
        r = t[0]
        print(f"  {label}: {int(r['clicks'])} klik | {int(r['impressions'])} impresi | CTR {r['ctr']*100:.2f}% | pos {r['position']:.1f}")

rows = q({"startDate": S90, "endDate": END, "dimensions": ["query"], "rowLimit": 5000})
BRAND = ("studiosoft", "studio soft", "studio soft surabaya")
brand = [r for r in rows if any(b in r["keys"][0].lower() for b in BRAND)]
non = [r for r in rows if r not in brand]


def agg(rs):
    c = sum(r["clicks"] for r in rs)
    i = sum(r["impressions"] for r in rs)
    p = sum(r["position"] * r["impressions"] for r in rs) / i if i else 0
    return c, i, p


c, i, p = agg(brand)
print(f"\n=== BRAND vs NON-BRAND (90d, {len(rows)} query) ===")
print(f"  BRAND    : {len(brand):>4} query | {int(i):>6} imp | {int(c):>5} klik | CTR {c/i*100 if i else 0:>5.1f}% | pos {p:.1f}")
c2, i2, p2 = agg(non)
print(f"  NON-BRAND: {len(non):>4} query | {int(i2):>6} imp | {int(c2):>5} klik | CTR {c2/i2*100 if i2 else 0:>5.1f}% | pos {p2:.1f}")

print("\n=== 15 QUERY dengan KLIK TERBANYAK (90d) ===")
for r in sorted(rows, key=lambda x: -x["clicks"])[:15]:
    print(f"  {int(r['clicks']):>4} klik | {int(r['impressions']):>5} imp | CTR {r['ctr']*100:>5.1f}% | pos {r['position']:>5.1f} | {r['keys'][0]}")

print("\n=== POSISI KUAT (pos <= 10) dengan impresi >= 10 ===")
kuat = [r for r in rows if r["position"] <= 10 and r["impressions"] >= 10]
kuat.sort(key=lambda x: -x["clicks"])
print(f"  {len(kuat)} query kuat")
for r in kuat[:25]:
    print(f"  {int(r['clicks']):>4} klik | {int(r['impressions']):>5} imp | pos {r['position']:>4.1f} | {r['keys'][0]}")

print("\n=== KLASTER TEMA (90d) ===")
KLASTER = {
    "SEO (jasa/layanan)": ("jasa seo", "seo surabaya", "seo agency", "konsultan seo", "seo profesional", "jasa optimasi"),
    "SEO (edukasi/info)": ("apa itu seo", "cara kerja seo", "belajar seo", "seo adalah", "tips seo", "cara optimasi"),
    "Website (jasa)": ("jasa pembuatan website", "buat website", "bikin website", "jasa website", "pembuatan website"),
    "Digital marketing": ("digital marketing", "marketing agency", "agensi digital", "social media", "iklan digital"),
    "AI/otomasi": ("ai ", "kecerdasan buatan", "chatbot", "otomasi", "automasi", "artificial"),
    "Branding": ("branding", "brand ", "logo", "identitas visual"),
    "Lokal (kota)": ("sidoarjo", "malang", "gresik", "jakarta", "bandung", "semarang", "jogja", "yogyakarta"),
    "Industri klien": ("klinik", "bengkel", "rumah sakit", "hukum", "firma", "restoran", "maklon", "sekolah"),
    "Konten/artikel": ("artikel", "konten", "copywriting", "menulis", "blog"),
}
for nama, kws in KLASTER.items():
    grp = [r for r in rows if any(k in r["keys"][0].lower() for k in kws)]
    if not grp:
        continue
    c, i, p = agg(grp)
    posisi_baik = len([r for r in grp if r["position"] <= 10])
    print(f"  {nama:<24} {len(grp):>4} query | {int(i):>6} imp | {int(c):>4} klik | CTR {c/i*100 if i else 0:>5.1f}% | pos {p:>5.1f} | pos<=10: {posisi_baik}")

print("\n=== HALAMAN paling banyak klik (90d) ===")
for r in q({"startDate": S90, "endDate": END, "dimensions": ["page"], "rowLimit": 15}):
    print(f"  {int(r['clicks']):>4} klik | {int(r['impressions']):>5} imp | CTR {r['ctr']*100:>5.1f}% | pos {r['position']:>5.1f} | {r['keys'][0].replace('https://studiosoft.id','')[:62]}")

print("\n=== GA4 28 hari: channel & halaman masuk ===")
for x in rep({"dateRanges": [{"startDate": S28, "endDate": END}], "dimensions": [{"name": "sessionDefaultChannelGroup"}],
              "metrics": [{"name": "sessions"}], "orderBys": [{"metric": {"metricName": "sessions"}, "desc": True}]}):
    print(f"  {x['dimensionValues'][0]['value']:<22} {x['metricValues'][0]['value']}")
print("  --- halaman masuk teratas (sesi | engagement) ---")
lp = rep({"dateRanges": [{"startDate": S28, "endDate": END}], "dimensions": [{"name": "landingPagePlusQueryString"}],
          "metrics": [{"name": "sessions"}, {"name": "userEngagementDuration"}, {"name": "bounceRate"}],
          "orderBys": [{"metric": {"metricName": "sessions"}, "desc": True}], "limit": 12})
for x in lp:
    print(f"    {x['metricValues'][0]['value']:>4} sesi | {float(x['metricValues'][1]['value']):>7.0f}s engagement | bounce {float(x['metricValues'][2]['value'])*100:>5.1f}% | {x['dimensionValues'][0]['value'][:58]}")
