"""Write dashboard/data.js: everything the static dashboard shows, as one JS object."""

from __future__ import annotations

import json
import math
from pathlib import Path

import numpy as np
import pandas as pd


def _clean(v):
    if isinstance(v, dict):
        return {str(k): _clean(x) for k, x in v.items()}
    if isinstance(v, (list, tuple)):
        return [_clean(x) for x in v]
    if isinstance(v, (pd.Timestamp,)):
        return None if pd.isna(v) else v.strftime("%Y-%m-%d")
    if isinstance(v, pd.Period):
        return str(v)
    if isinstance(v, (np.integer,)):
        return int(v)
    if isinstance(v, (float, np.floating)):
        if math.isnan(v) or math.isinf(v):
            return None
        f = float(v)
        return round(f) if abs(f) >= 1000 else round(f, 4)
    if v is pd.NA or v is pd.NaT:
        return None
    return v


def records(df: pd.DataFrame, columns: list[str] | None = None) -> list[dict]:
    if columns:
        df = df[columns]
    return _clean(df.to_dict(orient="records"))


def write_dashboard_data(payload: dict, path: Path) -> None:
    path.parent.mkdir(parents=True, exist_ok=True)
    text = json.dumps(_clean(payload), ensure_ascii=False, separators=(",", ":"))
    path.write_text("// Generated by `python -m steel_crm.cli run`. Do not edit by hand.\n"
                    f"const DASHBOARD_DATA = {text};\n", encoding="utf-8")
