#!/usr/bin/env python3
"""Cari keyword bernilai tinggi untuk studiosoft.id: banyak peminat (impresi), pesaing sepinya (posisi sudah dekat),
dan nilai klik yang hilang. Data: GSC 90 hari."""
import json, os, re
from google.oauth2 import service_account
from googleapiclient.discovery import build

KEY = os.path.expanduser("~/.hermes/gsc_service_account.json")
SITE = "https://studiosoft.id/"
SCOPES = ["https://www.googleapis.com/auth/webmasters.readonly"]

creds = service_account.Credentials.from_service_account_file(KEY, scopes=SCOPES)
sc = build("searchconsole", "v1", credentials=creds, cache_discovery=False)

body = {"startDate": "2026-06-25", "endDate": "2026-09-23", "dimensions": ["query"],
        "rowLimit": 5000, "dataState": "all"}
rows = sc.searchanalytics().query(siteUrl=SITE, body=body).execute().get("rows", [])
print(f"total query 90 hari: {len(rows)}")

# peta query -> halaman terbaik
body2 = dict(body, dimensions=["query", "page"])
rows2 = sc.searchanalytics().query(siteUrl=SITE, body=body2).execute().get("rows", [])


def kurva_ctr(pos):
    """CTR wajar pada posisi (dari kurva internal StudioSoft)."""
    if pos <= 3: return 0.029
    if pos <= 10: return 0.026
    if pos <= 20: return 0.010
    if pos <= 50: return 0.004
    return 0.0005


# kata berbayar: niat beli/komersial
BELI = re.compile(r"jasa|harga|biaya|tarif|murah|terbaik|terpercaya|profesional|beli|sewa|paket|konsultan|agency|agensi|service|berkualitas|rekomendasi|terdekat|surabaya|sidoarjo|gresik", re.I)
INFO = re.compile(r"apa itu|cara|mengapa|kenapa|pengertian|contoh|perbedaan|tips|panduan|manfaat|fungsi|artikel", re.I)

hasil = []
for r in rows:
    q = r["keys"][0]
    imp = r["impressions"]; klik = r["clicks"]; pos = r["position"]; ctr = r["ctr"]
    beli = 1 if BELI.search(q) else 0
    nilai = 0
    # peluang klik yang hilang bila naik ke posisi ~8
    ctr_target = 0.026
    klik_potensial = imp * ctr_target - klik
    # permintaan
    permintaan = min(imp / 200, 1.0)
    # kedekatan: posisi 11-30 paling mudah didorong, 4-10 paling cepat naik
    if 4 <= pos <= 10: dekat = 1.0
    elif 10 < pos <= 20: dekat = 0.85
    elif 20 < pos <= 40: dekat = 0.6
    elif pos <= 3: dekat = 0.5
    else: dekat = 0.25
    nilai = (0.45 * permintaan + 0.35 * min(max(klik_potensial, 0) / 40, 1.0) + 0.20 * dekat)
    if beli: nilai = min(1.0, nilai * 1.25)
    if INFO.search(q): nilai *= 0.8
    if len(q.split()) < 2: nilai *= 0.7
    hasil.append({"query": q, "imp": imp, "klik": klik, "ctr": round(ctr * 100, 2),
                  "pos": round(pos, 1), "komersial": beli, "nilai": round(nilai * 100)})

# halaman per query
peta = {}
for r in rows2:
    q, pg = r["keys"]
    if q not in peta or r["impressions"] > peta[q]["imp"]:
        peta[q] = {"page": pg, "imp": r["impressions"]}
for h in hasil:
    h["halaman"] = peta.get(h["query"], {}).get("page", "").replace("https://studiosoft.id", "")

hasil.sort(key=lambda x: (x["imp"], x["nilai"]), reverse=True)
print("\n=== 25 dengan impresi terbesar (di sini peminatnya terbukti ada) ===")
for h in hasil[:25]:
    print(f"  imp {h['imp']:>5} | klik {h['klik']:>3} | CTR {h['ctr']:>5}% | pos {h['pos']:>5} | "
          f"nilai {h['nilai']:>3} | {h['query'][:52]:<54} | {h['halaman'][:38]}")

print("\n=== 25 NILAI TERBAIK (peminat ada, posisi sudah dekat, niat komersial) ===")
terbaik = [h for h in hasil if h["imp"] >= 20]
terbaik.sort(key=lambda x: x["nilai"], reverse=True)
for h in terbaik[:25]:
    print(f"  nilai {h['nilai']:>3} | imp {h['imp']:>5} | klik {h['klik']:>3} | CTR {h['ctr']:>5}% | "
          f"pos {h['pos']:>5} | {h['query'][:50]:<52} | {h['halaman'][:36]}")

json.dump(hasil, open("drafts/ss_keyword_nilai.json", "w"), indent=1, ensure_ascii=False)
print(f"\n{len(hasil)} query dianalisis → drafts/ss_keyword_nilai.json")
