"""Allowlisted metric metadata and Explorer presets for Dashboard v5."""
from __future__ import annotations

from dataclasses import asdict, dataclass


@dataclass(frozen=True)
class Metric:
    id: str
    label: str
    unit: str
    unit_family: str
    raw_overlay_group: str
    group: str
    aggregation: str
    baseline_days: int
    baseline_min_observations: int
    index_mode: str
    correlation_id: str
    decimals: int = 1


METRICS: tuple[Metric, ...] = (
    Metric("symptom.total", "Symptome total", "0–21", "symptom_score", "symptom_score", "symptoms", "sum", 14, 3, "unsupported", "symptom_total", 0),
    Metric("apple.sleep", "Schlaf", "h", "duration_hours", "duration_hours", "apple_health", "sum", 14, 3, "ratio_100", "apple:sleep_analysis"),
    Metric("apple.resting_heart_rate", "Ruhepuls", "bpm", "heart_rate_bpm", "heart_rate_bpm", "apple_health", "avg", 30, 3, "ratio_100", "apple:resting_heart_rate"),
    Metric("apple.hrv", "HRV", "ms", "duration_ms", "duration_ms", "apple_health", "avg", 30, 3, "ratio_100", "apple:heart_rate_variability"),
    Metric("apple.steps", "Schritte", "Schritte", "count_steps", "count_steps", "apple_health", "sum", 14, 3, "ratio_100", "apple:step_count", 0),
    Metric("nutrition.histamine", "Histamin-Score", "Score", "histamine_score", "histamine_score", "nutrition", "sum", 14, 3, "unsupported", "nutrition:histamine_score"),
)

BY_ID = {metric.id: metric for metric in METRICS}

EXPLORER = {
    "modes": {
        "raw": {"max_series": 2, "compatibility": "same_raw_overlay_group"},
        "baseline_index": {"max_series": 4, "reference": 100},
    },
    "presets": [
        {
            "id": "sleep_recovery",
            "label": "Schlaf und Erholung",
            "mode": "baseline_index",
            "metric_ids": ["apple.sleep", "apple.hrv", "apple.resting_heart_rate"],
        },
        {
            "id": "heart_recovery",
            "label": "Herz und Erholung",
            "mode": "baseline_index",
            "metric_ids": ["apple.hrv", "apple.resting_heart_rate"],
        },
        {
            "id": "activity_sleep",
            "label": "Aktivität und Schlaf",
            "mode": "baseline_index",
            "metric_ids": ["apple.steps", "apple.sleep"],
        },
        {
            "id": "daily_symptoms",
            "label": "Dokumentierte Symptome",
            "mode": "raw",
            "metric_ids": ["symptom.total"],
        },
        {
            "id": "histamine_documentation",
            "label": "Dokumentierter Histamin-Score",
            "mode": "raw",
            "metric_ids": ["nutrition.histamine"],
        },
    ],
}


def public_registry() -> list[dict[str, object]]:
    return [asdict(metric) for metric in METRICS]


def public_explorer() -> dict[str, object]:
    return {
        "modes": {key: dict(value) for key, value in EXPLORER["modes"].items()},
        "presets": [dict(item) for item in EXPLORER["presets"]],
    }
