#!/usr/bin/env python3
"""Fase 1 StudioSoft «digital agency surabaya» — kumpulkan data dasar:
1) semua artikel (post) + isi mentah  2) GSC 90 hari per halaman  3) posisi Serper.
Simpan ke drafts/ss_fase1_data.json
"""
import base64, html, json, os, re, sys, time, urllib.error, urllib.request
from datetime import date, timedelta

WS = "/home/mantapman/.hermes/profiles/atun/workspace"
S = "https://studiosoft.id"
AUTH = base64.b64encode(b"bambangbot:q26r RePo BVy6 pwU2 F3z7 ouyl").decode()
UA = {"User-Agent": "Mozilla/5.0"}
OUT = f"{WS}/drafts/ss_fase1_data.json"

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)
akhir = date.today() - timedelta(days=2)
awal = akhir - timedelta(days=89)
A, B = awal.isoformat(), akhir.isoformat()


def rest(path, method="GET", data=None):
    h = {"Authorization": f"Basic {AUTH}", **UA}
    body = None
    if data is not None:
        body = json.dumps(data).encode()
        h["Content-Type"] = "application/json"
    r = urllib.request.Request(S + path, data=body, headers=h, method=method)
    for _ in range(3):
        try:
            with urllib.request.urlopen(r, timeout=180) as x:
                return x.status, json.loads(x.read())
        except urllib.error.HTTPError as e:
            return e.code, e.read().decode()[:200]
        except Exception:
            time.sleep(4)
    return 0, "gagal"


print("=== 1. artikel ===")
posts, page = [], 1
while True:
    st, d = rest(f"/wp-json/wp/v2/posts?per_page=100&page={page}&status=publish"
                 f"&context=edit&_fields=id,slug,link,title,date,content")
    if not isinstance(d, list):
        print("   berhenti:", st, str(d)[:80])
        break
    posts += d
    if len(d) < 100:
        break
    page += 1
print(f"   {len(posts)} artikel publish")
for p in posts:
    raw = p.get("content", {}).get("raw", "") if isinstance(p.get("content"), dict) else ""
    p["_raw"] = raw
    p["_judul"] = html.unescape(p["title"]["rendered"]) if isinstance(p["title"], dict) else str(p["title"])
    p["_kata"] = len(html.unescape(re.sub(r"<[^>]+>", " ", raw)).split())
    p["_tgl"] = p["date"][:10]

print("\n=== 2. GSC 90 hari ===")
hal = []
for r in gsc.searchanalytics().query(siteUrl=S + "/", body={
        "startDate": A, "endDate": B, "dimensions": ["page"], "rowLimit": 5000}).execute().get("rows", []):
    hal.append({"halaman": r["keys"][0], "klik": r["clicks"], "tayang": r["impressions"],
                "ctr": round(r["ctr"] * 100, 2), "posisi": round(r["position"], 1)})
print(f"   {len(hal)} halaman punya data")

pasangan = []
for r in gsc.searchanalytics().query(siteUrl=S + "/", body={
        "startDate": A, "endDate": B, "dimensions": ["page", "query"], "rowLimit": 5000}).execute().get("rows", []):
    if r["impressions"] >= 20:
        pasangan.append({"halaman": r["keys"][0], "kueri": r["keys"][1], "klik": r["clicks"],
                         "tayang": r["impressions"], "ctr": round(r["ctr"] * 100, 2),
                         "posisi": round(r["position"], 1)})
print(f"   {len(pasangan)} pasangan halaman+kueri (>=20 tayangan)")

print("\n=== 3. Serper ===")
KUNCI = json.load(open(f"{WS}/.serper_token.json"))["key"]
HS = {"X-API-KEY": KUNCI, "Content-Type": "application/json", "User-Agent": "Mozilla/5.0"}
serp = {}
for kw in ("digital agency surabaya", "jasa seo surabaya"):
    try:
        body = json.dumps({"q": kw, "gl": "id", "hl": "id", "num": 20}).encode()
        d = json.loads(urllib.request.urlopen(
            urllib.request.Request("https://google.serper.dev/search", data=body, headers=HS), timeout=90).read())
    except Exception as ex:
        print(f"   ❌ «{kw}» {str(ex)[:80]}")
        continue
    organic = d.get("organic") or []
    pos = next((i for i, h in enumerate(organic, 1) if "studiosoft.id" in str(h.get("link", ""))), None)
    serp[kw] = {"posisi": pos, "url_studiosoft": next((h.get("link") for h in organic
                                                       if "studiosoft.id" in str(h.get("link", ""))), None),
                "atas": [h.get("link") for h in organic[:10]],
                "ai_overview": bool(d.get("aiOverview"))}
    print(f"   «{kw}» → {'#' + str(pos) if pos else 'tidak masuk 20'} | AI Overview: "
          f"{'ada' if d.get('aiOverview') else 'tidak'}")
    time.sleep(0.8)

json.dump({"periode": [A, B], "posts": posts, "gsc_halaman": hal,
           "gsc_pasangan": pasangan, "serper": serp},
          open(OUT, "w"), ensure_ascii=False, indent=1)
print(f"\n→ {OUT}  ({os.path.getsize(OUT) // 1024} KB)")
