#!/usr/bin/env python3
"""Pull Plausible stats into LOOK_AT_THESE/state/metrics.json for the Executive Desk."""
from __future__ import annotations

import json
import os
import urllib.error
import urllib.parse
import urllib.request
from datetime import datetime, timezone
from pathlib import Path

ROOT = Path(__file__).resolve().parents[1]
STATE = ROOT / "state"
ENV_FILE = Path(__file__).resolve().parent / ".env"
SITE_ID = os.environ.get("PLAUSIBLE_SITE_ID", "texanoai.com")


def load_key() -> str:
    key = os.environ.get("PLAUSIBLE_API_KEY", "").strip()
    if key:
        return key
    if ENV_FILE.exists():
        for line in ENV_FILE.read_text(encoding="utf-8").splitlines():
            line = line.strip()
            if line.startswith("PLAUSIBLE_API_KEY="):
                return line.split("=", 1)[1].strip().strip('"').strip("'")
            if line.startswith("PLAUSIBLE_SITE_ID="):
                global SITE_ID
                SITE_ID = line.split("=", 1)[1].strip().strip('"').strip("'")
    return ""


def get(url: str, key: str) -> str:
    req = urllib.request.Request(url, headers={"Authorization": f"Bearer {key}"})
    with urllib.request.urlopen(req, timeout=20) as r:
        return r.read().decode("utf-8")


def main() -> None:
    STATE.mkdir(parents=True, exist_ok=True)
    out = STATE / "metrics.json"
    key = load_key()
    now = datetime.now(timezone.utc).strftime("%Y-%m-%dT%H:%M:%SZ")

    if not key:
        payload = {
            "ok": False,
            "updated": now,
            "error": "missing_api_key",
            "hint": "Create a Stats API key in Plausible → Settings → API Keys. Save as PLAUSIBLE_API_KEY in analytics/.env",
            "realtime": None,
            "today": {},
            "days30": {},
            "site_id": SITE_ID,
        }
        out.write_text(json.dumps(payload, indent=2), encoding="utf-8")
        print(json.dumps(payload, indent=2))
        return

    try:
        realtime = int(
            get(
                f"https://plausible.io/api/v1/stats/realtime/visitors?site_id={urllib.parse.quote(SITE_ID)}",
                key,
            ).strip()
        )
        today_raw = get(
            "https://plausible.io/api/v1/stats/aggregate?"
            + urllib.parse.urlencode(
                {
                    "site_id": SITE_ID,
                    "period": "day",
                    "metrics": "visitors,pageviews,bounce_rate,visit_duration",
                }
            ),
            key,
        )
        d30_raw = get(
            "https://plausible.io/api/v1/stats/aggregate?"
            + urllib.parse.urlencode(
                {
                    "site_id": SITE_ID,
                    "period": "30d",
                    "metrics": "visitors,pageviews,bounce_rate,visit_duration",
                }
            ),
            key,
        )
        today = json.loads(today_raw).get("results", {})
        d30 = json.loads(d30_raw).get("results", {})

        def flat(block: dict) -> dict:
            outd = {}
            for k, v in block.items():
                if isinstance(v, dict) and "value" in v:
                    outd[k] = v["value"]
                else:
                    outd[k] = v
            return outd

        payload = {
            "ok": True,
            "updated": now,
            "site_id": SITE_ID,
            "realtime": realtime,
            "today": flat(today),
            "days30": flat(d30),
            "search_console": {
                "status": "not_wired",
                "note": "Verify Search Console next — free Google Search demand data",
            },
        }
        out.write_text(json.dumps(payload, indent=2), encoding="utf-8")
        print(json.dumps(payload, indent=2))
    except urllib.error.HTTPError as e:
        body = e.read().decode("utf-8", errors="replace")
        payload = {
            "ok": False,
            "updated": now,
            "error": f"http_{e.code}",
            "detail": body[:500],
            "site_id": SITE_ID,
            "realtime": None,
            "today": {},
            "days30": {},
        }
        out.write_text(json.dumps(payload, indent=2), encoding="utf-8")
        print(json.dumps(payload, indent=2))
        raise SystemExit(1)


if __name__ == "__main__":
    main()
