#!/usr/bin/env python3
"""Compare tous les rapports Umami sur une période donnée."""

import json
import os
import sys
import urllib.error
import urllib.request
from datetime import datetime, timedelta, timezone

BASE = os.environ.get("UMAMI_HOST", "https://analytics.arnaud-merigeau.fr")
USER = os.environ.get("UMAMI_ADMIN_USER", os.environ.get("UMAMI_SITE_ID", "admin"))
PASS = os.environ.get("UMAMI_ADMIN_PASSWORD", os.environ.get("UMAMI_SITE_PASSWORD", "umami"))
WEBSITE_ID = "a44e818c-2c21-471d-aa97-00bc34c2f23f"
DAYS = int(sys.argv[1]) if len(sys.argv) > 1 else 30

# Clés Umami UI sauvegardées dans parameters — ne pas les renvoyer à l'API reports.
IGNORED_PARAM_KEYS = {"websiteId", "dateRange"}


def login():
    req = urllib.request.Request(
        f"{BASE}/api/auth/login",
        data=json.dumps({"username": USER, "password": PASS}).encode(),
        headers={"Content-Type": "application/json"},
        method="POST",
    )
    return json.loads(urllib.request.urlopen(req).read())["token"]


def api_get(token, path):
    req = urllib.request.Request(f"{BASE}{path}", headers={"Authorization": f"Bearer {token}"})
    return json.loads(urllib.request.urlopen(req).read())


def api_post(token, path, body):
    req = urllib.request.Request(
        f"{BASE}{path}",
        data=json.dumps(body).encode(),
        headers={"Authorization": f"Bearer {token}", "Content-Type": "application/json"},
        method="POST",
    )
    return json.loads(urllib.request.urlopen(req).read())


def safe_post(token, path, body):
    try:
        return api_post(token, path, body), None
    except urllib.error.HTTPError as e:
        return None, e.read().decode("utf-8", errors="replace")[:300]


def report_params(params: dict) -> dict:
    if isinstance(params, str):
        params = json.loads(params)
    return {k: v for k, v in params.items() if k not in IGNORED_PARAM_KEYS}


def build_report_body(rtype: str, params: dict, dr: dict) -> dict:
    params = report_params(params)
    body = {"websiteId": WEBSITE_ID, "dateRange": dr}

    if rtype == "funnel":
        body["window"] = params.get("window", 60)
        body["steps"] = params.get("steps", [])
    elif rtype == "goals":
        body["goals"] = params.get("goals", [])
    elif rtype == "journey":
        body["steps"] = params.get("steps", 5)
    elif rtype == "revenue":
        body.update({"currency": "EUR", "timezone": "Europe/Paris"})
    elif rtype == "attribution":
        body.update(
            {
                "timezone": "Europe/Paris",
                "currency": "EUR",
                "model": params.get("model", "firstClick"),
                "steps": params.get("steps", []),
            }
        )
    elif rtype == "insights":
        body["fields"] = params.get(
            "fields",
            [
                {"name": "visitors", "type": "number", "label": "Visiteurs"},
                {"name": "views", "type": "number", "label": "Pages vues"},
            ],
        )
        body["filters"] = params.get("filters", [])
    elif rtype == "utm":
        pass
    else:
        body.update(params)

    return body


def main():
    token = login()
    end = datetime.now(timezone.utc)
    start = end - timedelta(days=DAYS)
    start_ms = int(start.timestamp() * 1000)
    end_ms = int(end.timestamp() * 1000)
    dr = {"startDate": start.isoformat(), "endDate": end.isoformat(), "unit": "day"}

    out = {
        "period_days": DAYS,
        "since": start.isoformat(),
        "until": end.isoformat(),
        "stats": api_get(token, f"/api/websites/{WEBSITE_ID}/stats?startAt={start_ms}&endAt={end_ms}"),
        "events": api_get(token, f"/api/websites/{WEBSITE_ID}/metrics?type=event&startAt={start_ms}&endAt={end_ms}"),
        "top_urls": api_get(token, f"/api/websites/{WEBSITE_ID}/metrics?type=url&startAt={start_ms}&endAt={end_ms}")[:20],
        "referrers": api_get(token, f"/api/websites/{WEBSITE_ID}/metrics?type=referrer&startAt={start_ms}&endAt={end_ms}")[:10],
        "reports": {},
    }

    rev, err = safe_post(token, "/api/reports/revenue", build_report_body("revenue", {}, dr))
    out["reports"]["Chiffre d'affaires"] = {"type": "revenue", "data": rev, "error": err}

    reports = api_get(token, f"/api/reports?websiteId={WEBSITE_ID}&pageSize=100")
    items = reports.get("data", reports)

    for report in items:
        name = report["name"]
        rtype = report["type"]
        params = report.get("parameters", {})
        body = build_report_body(rtype, params, dr)
        data, err = safe_post(token, f"/api/reports/{rtype}", body)
        out["reports"][name] = {
            "type": rtype,
            "parameters": report_params(params),
            "data": data,
            "error": err,
        }

    print(json.dumps(out, indent=2, ensure_ascii=False))


if __name__ == "__main__":
    main()
