#!/usr/bin/env python3
"""Apakah artikel pendek (<1.000 kata) tampil lebih buruk? Bukti dari data StudioSoft sendiri."""
import base64, html, json, os, re, statistics, time, urllib.request, urllib.error
from datetime import date, timedelta
from google.oauth2 import service_account
from googleapiclient.discovery import build

S = "https://studiosoft.id"
AUTH = base64.b64encode(b"bambangbot:q26r RePo BVy6 pwU2 F3z7 ouyl").decode()
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)
e = date.today() - timedelta(days=2)
a, b = (e - timedelta(days=89)).isoformat(), e.isoformat()


def wp(path):
    r = urllib.request.Request(S + path, headers={"Authorization": f"Basic {AUTH}", "User-Agent": "Mozilla/5.0"})
    for _ in range(3):
        try:
            with urllib.request.urlopen(r, timeout=240) as x:
                return json.loads(x.read())
        except Exception:
            time.sleep(3)
    return []


imp = {}
for r in gsc.searchanalytics().query(siteUrl=S + "/", body={"startDate": a, "endDate": b,
                                                            "dimensions": ["page"], "rowLimit": 1000}).execute().get("rows", []):
    imp[r["keys"][0].rstrip("/")] = (int(r["impressions"]), int(r["clicks"]), r["position"])

posts, page = [], 1
while True:
    d = wp(f"/wp-json/wp/v2/posts?per_page=100&page={page}&context=edit&_fields=id,link,title,content")
    posts += d
    if len(d) < 100:
        break
    page += 1

PITA = [(0, 600, "di bawah 600 kata"), (600, 1000, "600–999 kata"), (1000, 1500, "1.000–1.499 kata"),
        (1500, 10000, "1.500 kata ke atas")]
data = {label: [] for _, _, label in PITA}
for p in posts:
    raw = p["content"]["raw"] if isinstance(p["content"], dict) else ""
    kata = len(html.unescape(re.sub(r"<[^>]+>", " ", raw)).split())
    d = imp.get(p["link"].rstrip("/"), (0, 0, 0))
    for lo, hi, label in PITA:
        if lo <= kata < hi:
            data[label].append((kata, d[0], d[1], d[2]))
            break

print("=== ARTIKEL STUDIOSOFT: panjang vs performa (GSC 90 hari) ===")
print(f"{'kelompok':<20} {'jml':>4} {'kata rata2':>10} {'impresi rata2':>14} {'klik rata2':>11} {'posisi':>7} {'% dapat impresi':>16}")
for _, _, label in PITA:
    rows = data[label]
    if not rows:
        continue
    kata = statistics.mean(r[0] for r in rows)
    imp_ = statistics.mean(r[1] for r in rows)
    klik = statistics.mean(r[2] for r in rows)
    pos = statistics.mean(r[3] for r in rows if r[3] > 0) if any(r[3] > 0 for r in rows) else 0
    ada = sum(1 for r in rows if r[1] > 0) / len(rows) * 100
    print(f"{label:<20} {len(rows):>4} {kata:>10.0f} {imp_:>14.1f} {klik:>11.2f} {pos:>7.1f} {ada:>15.0f}%")

print("\n=== pembanding: artikel yang SUDAH dapat impresi >= 100 ===")
bagus = [(k, i, c, p) for lbl in data for (k, i, c, p) in data[lbl] if i >= 100]
if bagus:
    print(f"  jumlah: {len(bagus)} artikel | rata-rata kata: {statistics.mean(x[0] for x in bagus):.0f} | "
          f"median: {statistics.median(x[0] for x in bagus):.0f}")
    pendek = [x for x in bagus if x[0] < 1000]
    print(f"  di antaranya di bawah 1.000 kata: {len(pendek)} artikel ({len(pendek)/len(bagus)*100:.0f}%)")
    for k, i, c, p in sorted(pendek, key=lambda x: -x[1])[:6]:
        print(f"    {k:>5} kata | {i:>5} impresi | {c} klik | pos {p:.1f}")
