#!/usr/bin/env python3
"""Skor nilai keyword StudioSoft (0-100): permintaan, posisi terbaik, sinyal pecah, niat, lokalitas."""
import json, math, os, re
from google.oauth2 import service_account
from googleapiclient.discovery import build

creds = service_account.Credentials.from_service_account_file(
    os.path.expanduser("~/.hermes/gsc_service_account.json"),
    scopes=["https://www.googleapis.com/auth/webmasters.readonly"])
sc = build("searchconsole", "v1", credentials=creds, cache_discovery=False)
SITE = "https://studiosoft.id/"
body = {"startDate": "2026-06-25", "endDate": "2026-09-23", "dimensions": ["query", "page"],
        "rowLimit": 5000, "dataState": "all"}
rows = sc.searchanalytics().query(siteUrl=SITE, body=body).execute().get("rows", [])

q = {}
for r in rows:
    k, pg = r["keys"]
    d = q.setdefault(k, {"imp": 0, "klik": 0, "halaman": []})
    d["imp"] += r["impressions"]; d["klik"] += r["clicks"]
    d["halaman"].append((r["impressions"], round(r["position"], 1), pg.replace("https://www.studiosoft.id", "").replace("https://studiosoft.id", "")))

BELI = re.compile(r"jasa|harga|biaya|murah|terbaik|terpercaya|profesional|paket|agency|agensi|konsultan|service", re.I)
LOKAL = re.compile(r"surabaya|sidoarjo|gresik|malang|jawa timur", re.I)

hasil = []
for k, d in q.items():
    if d["imp"] < 15:
        continue
    halaman = sorted(d["halaman"], reverse=True)
    pos_baik = min(h[1] for h in halaman)
    pos_utama = halaman[0][1]        # posisi halaman yang impresinya terbesar (halaman yang benar-benar tampil)
    n_hal = len(halaman)
    # permintaan (0-35)
    s_permintaan = min(35, 35 * math.log(1 + d["imp"]) / math.log(1 + 800))
    # posisi terbaik halaman (0-25)
    if pos_baik <= 10: s_pos = 25
    elif pos_baik <= 20: s_pos = 18
    elif pos_baik <= 30: s_pos = 12
    elif pos_baik <= 50: s_pos = 6
    else: s_pos = 2
    # sinyal pecah (0-15): makin sedikit halaman sendiri yang bertarung, makin baik
    s_pecah = 15 if n_hal <= 2 else 10 if n_hal <= 5 else 5 if n_hal <= 10 else 2
    # niat komersial (0-15)
    s_beli = 15 if BELI.search(k) else 3
    # lokalitas (0-10)
    s_lokal = 10 if LOKAL.search(k) else 0
    skor = round(s_permintaan + s_pos + s_pecah + s_beli + s_lokal)
    ctr = round(d["klik"] / d["imp"] * 100, 2)
    hasil.append({"query": k, "imp": d["imp"], "klik": d["klik"], "ctr": ctr, "pos_baik": pos_baik,
                  "pos_utama": pos_utama, "pos_rata": round(sum(h[1] * h[0] for h in halaman) / d["imp"], 1),
                  "n_halaman": n_hal, "halaman_terbaik": halaman[0][2], "skor": skor})

hasil.sort(key=lambda x: x["skor"], reverse=True)
print(f"{'skor':>5} {'imp':>5} {'klik':>5} {'CTR':>6} {'pos utama':>9} {'posbaik':>8} {'hlm':>4}  keyword / halaman terbaik")
for h in hasil[:30]:
    print(f"{h['skor']:>5} {h['imp']:>5} {h['klik']:>5} {h['ctr']:>5}% {h['pos_utama']:>9} {h['pos_baik']:>8} {h['n_halaman']:>4}  "
          f"{h['query'][:42]:<44} {h['halaman_terbaik'][:36]}")
json.dump(hasil, open("drafts/ss_keyword_skor.json", "w"), indent=1, ensure_ascii=False)
print(f"\n{len(hasil)} keyword berskor → drafts/ss_keyword_skor.json")
