#!/usr/bin/env python3
"""Skor keyword DAS (Alphard, Lexus + klaster brand lain) + deteksi kanibalisasi halaman."""
import base64, json, os, re, urllib.request
from datetime import date, timedelta
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"])
gsc = build("webmasters", "v3", credentials=creds, cache_discovery=False)
SITE = "https://dasindonesia.com/"
WS = os.path.dirname(os.path.abspath(__file__))
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=SITE, body=body).execute().get("rows", [])


rows90 = q({"startDate": S90, "endDate": END, "dimensions": ["query"], "rowLimit": 5000})
rows28 = q({"startDate": S28, "endDate": END, "dimensions": ["query"], "rowLimit": 5000})
d28 = {r["keys"][0]: r for r in rows28}


def target_ctr(pos):
    if pos <= 3: return 0.15
    if pos <= 6: return 0.08
    if pos <= 10: return 0.05
    if pos <= 15: return 0.03
    if pos <= 20: return 0.02
    return 0.01


# skor keyword individual
kw = []
for r in rows90:
    imp, clk, pos = r["impressions"], r["clicks"], r["position"]
    pot = imp * target_ctr(pos)            # potensi klik realistis 90 hari
    delta = max(0.0, pot - clk)            # klik yang hilang
    dem = min(5, 1 + imp / 60)             # skor permintaan 1-5
    siap = 5 if pos <= 10 else (4 if pos <= 15 else (3 if pos <= 25 else 1))
    nilai = round(0.40 * (dem / 5 * 100) + 0.40 * min(100, delta / 4) + 0.20 * (siap / 5 * 100))
    kw.append({"kw": r["keys"][0], "imp": int(imp), "klik": int(clk), "ctr": r["ctr"] * 100,
               "pos": pos, "pot_klik": round(pot, 1), "hilang": round(delta, 1), "nilai": nilai,
               "imp28": int(d28.get(r["keys"][0], {}).get("impressions", 0)),
               "pos28": d28.get(r["keys"][0], {}).get("position")})

BRANDS = ["alphard", "lexus", "nissan", "toyota", "bmw", "honda", "mercedes", "benz", "mitsubishi",
          "pajero", "innova", "fortuner", "avanza", "xenia", "mazda", "wuling", "chery", "hyundai"]
klaster = []
for b in BRANDS:
    sub = [x for x in kw if b in x["kw"].lower()]
    if not sub:
        continue
    imp = sum(x["imp"] for x in sub)
    klik = sum(x["klik"] for x in sub)
    pos = sum(x["pos"] * x["imp"] for x in sub) / imp if imp else 0
    pot = sum(x["pot_klik"] for x in sub)
    nilai = round(sum(x["nilai"] * x["imp"] for x in sub) / imp) if imp else 0
    klaster.append({"brand": b, "n": len(sub), "imp": int(imp), "klik": int(klik),
                    "ctr": round(klik / imp * 100, 1) if imp else 0, "pos": round(pos, 1),
                    "pot_klik": round(pot, 1), "nilai": nilai,
                    "top": sorted(sub, key=lambda x: -x["imp"])[:3]})
klaster.sort(key=lambda x: -x["nilai"])

# halaman per klaster (kanibalisasi)
hal = {}
for b in ("alphard", "lexus"):
    hal[b] = q({"startDate": S90, "endDate": END, "dimensions": ["page"],
                "dimensionFilterGroups": [{"filters": [{"dimension": "query", "operator": "contains", "expression": b}]}],
                "rowLimit": 15})

# inventaris WP
AUTH = None
try:
    import memory_creds  # tidak ada; fallback di bawah
except Exception:
    pass
creds_wp = base64.b64encode(b"bambangbot:" + os.environ.get("DAS_APP_PASS", "").encode()).decode()

print("=== SKOR KLASTER BRAND (90 hari) ===")
print(f"{'brand':<12} {'query':>5} {'impresi':>8} {'klik':>5} {'CTR':>6} {'pos':>5} {'potensi klik':>12} {'NILAI':>6}")
for k in klaster:
    print(f"{k['brand']:<12} {k['n']:>5} {k['imp']:>8} {k['klik']:>5} {k['ctr']:>5}% {k['pos']:>5} {k['pot_klik']:>12} {k['nilai']:>6}")

print("\n=== TOP 25 KEYWORD dengan NILAI tertinggi (semua topik) ===")
for x in sorted(kw, key=lambda x: -x["nilai"])[:25]:
    print(f"  nilai {x['nilai']:>3} | {x['imp']:>5} imp | {x['klik']:>3} klik | pos {x['pos']:>5.1f} | hilang {x['hilang']:>5} klik | {x['kw'][:60]}")

print("\n=== ALPHARD & LEXUS: detail keyword ===")
for b in ("alphard", "lexus"):
    print(f"\n-- {b} --")
    for x in sorted([x for x in kw if b in x["kw"].lower()], key=lambda x: -x["nilai"]):
        print(f"  nilai {x['nilai']:>3} | {x['imp']:>4} imp | {x['klik']:>2} klik | CTR {x['ctr']:>5.1f}% | pos {x['pos']:>5.1f} | 28d: {x['imp28']} imp | {x['kw']}")
    print(f"  halaman yang menahan:")
    for r in hal[b]:
        print(f"    {int(r['impressions']):>4} imp | {int(r['clicks'])} klik | pos {r['position']:>5.1f} | {r['keys'][0]}")

json.dump({"kw": kw, "klaster": klaster, "hal": hal}, open(os.path.join(WS, "das_keyword_score.json"), "w"), indent=1)
print("\ndisimpan: das_keyword_score.json")
