#!/usr/bin/env python3
"""The Skin Code Clinic — potret SEO dari GSC + GA4 (data nyata) untuk dasar 30 caption GBP."""
import os
from datetime import date, timedelta
from collections import Counter

from google.oauth2 import service_account
from googleapiclient.discovery import build

SITE = "https://www.theskincodeclinic.com/"
PROP = "properties/490140645"
creds = service_account.Credentials.from_service_account_file(
    os.path.expanduser("~/.hermes/gsc_service_account.json"),
    scopes=["https://www.googleapis.com/auth/webmasters.readonly",
            "https://www.googleapis.com/auth/analytics.readonly"])
gsc = build("webmasters", "v3", credentials=creds, cache_discovery=False)
ga = build("analyticsdata", "v1beta", credentials=creds, cache_discovery=False)
AKHIR = date.today() - timedelta(days=2)
AWAL = AKHIR - timedelta(days=89)


def q(a, b, dims=None, limit=2000):
    body = {"startDate": a.isoformat(), "endDate": b.isoformat(), "rowLimit": limit}
    if dims:
        body["dimensions"] = dims
    return gsc.searchanalytics().query(siteUrl=SITE, body=body).execute().get("rows", [])


def total(a, b):
    r = q(a, b)
    if not r:
        return 0, 0, 0.0
    x = r[0]
    return int(x["clicks"]), int(x["impressions"]), round(x["position"], 1)


def ga_run(dims, mets, a, b, limit=200, order=None):
    body = {"dateRanges": [{"startDate": a.isoformat(), "endDate": b.isoformat()}],
            "dimensions": [{"name": d} for d in dims], "metrics": [{"name": m} for m in mets],
            "limit": limit}
    if order:
        body["orderBys"] = [{"metric": {"metricName": order}, "desc": True}]
    try:
        return ga.properties().runReport(property=PROP, body=body).execute().get("rows", [])
    except Exception as e:
        print(f"  ❌ GA4: {str(e)[:150]}")
        return []


print("=== THE SKIN CODE CLINIC — GSC (90 hari) ===")
k, t, p = total(AWAL, AKHIR)
k28, t28, p28 = total(AKHIR - timedelta(days=27), AKHIR)
k28p, t28p, p28p = total(AKHIR - timedelta(days=55), AKHIR - timedelta(days=28))
print(f"  90 hari : {k} klik · {t} tayangan · posisi {p}")
print(f"  28 hari : {k28} klik · {t28} tayangan · posisi {p28}")
print(f"  28 hari sebelumnya: {k28p} klik · {t28p} tayangan · posisi {p28p}")

print("\n  tren mingguan (8 pekan):")
for i in range(7, -1, -1):
    b = AKHIR - timedelta(days=7 * i)
    a = b - timedelta(days=6)
    kk, tt, pp = total(a, b)
    print(f"    {a} s/d {b} | klik {kk:>4} | tayang {tt:>6} | pos {pp:>5} | {'█' * min(40, tt // 40)}")

ku = q(AKHIR - timedelta(days=27), AKHIR, ["query"])
print(f"\n  kueri 28 hari: {len(ku)}")
print("  25 kueri dengan tayangan terbanyak:")
for r in sorted(ku, key=lambda x: -x["impressions"])[:25]:
    print(f"    {r['impressions']:>5} tayang | {int(r['clicks']):>3} klik | pos {r['position']:>5.1f} | «{r['keys'][0]}»")

print("\n  kueri lokal (mengandung surabaya/sidoarjo/terdekat):")
lokal = [r for r in ku if any(x in r["keys"][0].lower() for x in ("surabaya", "sidoarjo", "terdekat", "dekat"))]
for r in sorted(lokal, key=lambda x: -x["impressions"])[:15]:
    print(f"    {r['impressions']:>5} tayang | {int(r['clicks']):>3} klik | pos {r['position']:>5.1f} | «{r['keys'][0]}»")

ha = q(AKHIR - timedelta(days=27), AKHIR, ["page"])
print(f"\n  halaman 28 hari: {len(ha)}")
for r in sorted(ha, key=lambda x: -x["impressions"])[:15]:
    print(f"    {r['impressions']:>5} tayang | {int(r['clicks']):>3} klik | pos {r['position']:>5.1f} | {r['keys'][0][:70]}")

print("\n=== GA4 (properti 490140645) ===")
for label, a, b in (("28 hari terakhir", AKHIR - timedelta(days=27), AKHIR),
                    ("28 hari sebelumnya", AKHIR - timedelta(days=55), AKHIR - timedelta(days=28))):
    rows = ga_run(["sessionDefaultChannelGroup"], ["sessions", "keyEvents"], a, b, order="sessions")
    print(f"  {label}:")
    for r in rows[:6]:
        print(f"     {r['dimensionValues'][0]['value']:<20} sesi {r['metricValues'][0]['value']:>5} | "
              f"key event {r['metricValues'][1]['value']:>4}")

print("\n  kejadian 28 hari (10 teratas):")
for r in ga_run(["eventName"], ["eventCount"], AKHIR - timedelta(days=27), AKHIR, order="eventCount")[:10]:
    print(f"     {r['dimensionValues'][0]['value']:<28} {r['metricValues'][0]['value']}")

print("\n  halaman pendaratan 28 hari (12 teratas):")
for r in ga_run(["landingPagePlusQueryString"], ["sessions", "keyEvents"], AKHIR - timedelta(days=27), AKHIR,
                limit=12, order="sessions"):
    print(f"     {r['metricValues'][0]['value']:>5} sesi | {r['metricValues'][1]['value']:>3} key event | "
          f"{r['dimensionValues'][0]['value'][:60]}")
