#!/usr/bin/env python3
"""Analisis mendalam GSC LEIT: halaman, klaster query, brand vs non-brand, peluang."""
import json, os, re
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"])
gsc = build("webmasters", "v3", credentials=creds, cache_discovery=False)
SITE = "https://www.leitsurabaya.com/"
end = (date.today() - timedelta(days=2)).isoformat()
start28 = (date.fromisoformat(end) - timedelta(days=27)).isoformat()
start90 = (date.fromisoformat(end) - timedelta(days=89)).isoformat()


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


pages = q({"startDate": start28, "endDate": end, "dimensions": ["page"], "rowLimit": 500})
print(f"=== SEMUA halaman 28d ({len(pages)} url) ===")
print("halaman dengan impresi >= 2:")
for r in sorted(pages, key=lambda x: -x["impressions"]):
    if r["impressions"] >= 2:
        print(f"  {int(r['impressions']):>5} imp | {int(r['clicks']):>3} klik | CTR {r['ctr']*100:>5.1f}% | pos {r['position']:>5.1f} | {r['keys'][0].replace('https://www.leitsurabaya.com','')}")
kosong = [r for r in pages if r["impressions"] <= 1]
print(f"halaman impresi 0-1: {len(kosong)}")

qs = q({"startDate": start90, "endDate": end, "dimensions": ["query"], "rowLimit": 1000})
BRAND = ("leit", "leadership-english", "leadership english")
brand = [r for r in qs if any(b in r["keys"][0].lower() for b in BRAND)]
non = [r for r in qs if not any(b in r["keys"][0].lower() for b in BRAND)]


def tot(rows):
    c = sum(r["clicks"] for r in rows)
    i = sum(r["impressions"] for r in rows)
    return c, i, (c / i * 100 if i else 0)


print(f"\n=== 90d brand vs non-brand ({len(qs)} query unik) ===")
print(f"  BRAND    : {len(brand):>3} query | {int(tot(brand)[1]):>6} imp | {int(tot(brand)[0]):>4} klik | CTR {tot(brand)[2]:.1f}%")
print(f"  NON-BRAND: {len(non):>3} query | {int(tot(non)[1]):>6} imp | {int(tot(non)[0]):>4} klik | CTR {tot(non)[2]:.1f}%")

KLASTER = {
    "IELTS": ("ielts",),
    "TOEFL": ("toefl",),
    "kursus/les + surabaya": ("kursus bahasa inggris", "les bahasa inggris", "kursus inggris", "les inggris", "bimbel"),
    "terdekat/near me": ("terdekat", "near me", "dekat"),
    "anak/TK/SD": ("anak", "tk", "sd", "balita"),
    "surabaya timur/barat/lokasi": ("timur", "barat", "pakuwon", "waterplace", "lokasi", "alamat"),
    "beasiswa/kerja/traveling": ("beasiswa", "kerja", "wawancara", "traveling", "study abroad", "gaji"),
}
print("\n=== 90d per klaster tema ===")
for nama, kws in KLASTER.items():
    rows = [r for r in qs if any(k in r["keys"][0].lower() for k in kws)]
    if not rows:
        continue
    c, i, ctr = tot(rows)
    pos = sum(r["position"] * r["impressions"] for r in rows) / i if i else 0
    top = sorted(rows, key=lambda r: -r["impressions"])[:3]
    print(f"  {nama:<28} {int(i):>5} imp | {int(c):>3} klik | CTR {ctr:>5.1f}% | pos {pos:>5.1f} | " +
          "; ".join(f"{t['keys'][0]} ({int(t['impressions'])})" for t in top))
