#!/usr/bin/env python3
"""DAS: jalankan PageSpeed Insights (mobile + desktop) untuk beranda dan satu halaman artikel."""
import json, os, re, sys, time, urllib.parse, urllib.request, urllib.error

WS = "/home/mantapman/.hermes/profiles/atun/workspace"
URL_UJI = sys.argv[1] if len(sys.argv) > 1 else "https://dasindonesia.com/"
STRATEGI = ("mobile", "desktop")

# cari kunci API bila ada
KUNCI = None
for nama in ("psi_key.txt", "pagespeed_key.txt", ".psi_key", "google_api_key.txt"):
    p = f"{WS}/{nama}"
    if os.path.exists(p):
        KUNCI = open(p).read().strip()
        print(f"(memakai kunci API dari {nama})")
        break

for strat in STRATEGI:
    q = {"url": URL_UJI, "strategy": strat, "category": ["performance", "seo", "accessibility", "best-practices"]}
    if KUNCI:
        q["key"] = KUNCI
    u = "https://www.googleapis.com/pagespeedonline/v5/runPagespeed?" + urllib.parse.urlencode(q, doseq=True)
    print(f"\n=== {strat.upper()} : {URL_UJI} ===")
    for percobaan in range(3):
        try:
            with urllib.request.urlopen(urllib.request.Request(u, headers={"User-Agent": "Mozilla/5.0"}), timeout=280) as x:
                d = json.loads(x.read())
            break
        except urllib.error.HTTPError as e:
            pesan = e.read().decode()[:200]
            print(f"   percobaan {percobaan + 1}: HTTP {e.code} {pesan[:120]}")
            if e.code in (429, 500, 503):
                time.sleep(25)
                continue
            d = None
            break
        except Exception as e:
            print(f"   percobaan {percobaan + 1}: {str(e)[:100]}")
            time.sleep(20)
            d = None
    else:
        d = None

    if not d:
        print("   gagal mengambil data")
        continue

    lr = d.get("lighthouseResult", {})
    skor = {k: round((v.get("score") or 0) * 100) for k, v in lr.get("categories", {}).items()}
    print("   SKOR:", skor)
    metrik = lr.get("audits", {})
    for k in ("first-contentful-paint", "largest-contentful-paint", "total-blocking-time",
              "cumulative-layout-shift", "speed-index", "interactive"):
        a = metrik.get(k, {})
        if a:
            print(f"   {a.get('title', k):<34} {a.get('displayValue', '-')}")

    print("   --- peluang perbaikan (yang nilainya > 0) ---")
    for k, a in metrik.items():
        detail = a.get("details", {}) or {}
        if a.get("score") is not None and a.get("score") < 0.9 and detail.get("overallSavingsMs"):
            print(f"      {a.get('title', k)[:58]:<60} hemat {round(detail['overallSavingsMs'])} ms")
    print("   --- diagnostik penting ---")
    for k in ("uses-optimized-images", "uses-responsive-images", "offscreen-images", "unminified-javascript",
              "unused-javascript", "render-blocking-resources", "uses-text-compression", "uses-long-cache-ttl",
              "server-response-time", "total-byte-weight", "dom-size", "third-party-summary", "uses-rel-preconnect"):
        a = metrik.get(k, {})
        if not a:
            continue
        d2 = a.get("details", {}) or {}
        hemat = d2.get("overallSavingsMs") or d2.get("overallSavingsBytes")
        tambahan = ""
        if isinstance(hemat, (int, float)) and hemat:
            tambahan = f" | hemat {round(hemat/1024)} KB" if k in ("uses-optimized-images", "uses-responsive-images",
                                                                   "total-byte-weight", "unused-javascript") else f" | hemat {round(hemat)} ms"
        print(f"      [{a.get('score')}] {a.get('title', k)[:56]:<58}{tambahan}")

    json.dump(d, open(f"{WS}/drafts/das_psi_{strat}.json", "w"), indent=1)
