"use client"; import { ArrowTrendingDownIcon, BoltIcon, ChartBarIcon, FireIcon, ScaleIcon, SparklesIcon, TrophyIcon, } from "@heroicons/react/24/outline"; import { useMemo } from "react"; import { HealthStatsSummary, todayKey } from "@/lib/hellth-data"; import { trpc } from "@/lib/trpc"; function formatDate(dateKey: string) { return new Date(`${dateKey}T12:00:00`).toLocaleDateString("de-DE", { day: "2-digit", month: "2-digit", }); } function StatCard({ title, value, detail, tone = "gray", icon: Icon, }: { title: string; value: string; detail: string; tone?: "gray" | "green" | "blue" | "amber" | "rose"; icon: React.ComponentType<{ className?: string }>; }) { const tones = { gray: "bg-gray-50 text-gray-950", green: "bg-emerald-50 text-emerald-800", blue: "bg-blue-50 text-blue-800", amber: "bg-amber-50 text-amber-800", rose: "bg-rose-50 text-rose-800", }; return (

{title}

{value}

{detail}

); } function MiniBars({ summary }: { summary: HealthStatsSummary }) { const maxCalories = Math.max(...summary.days.map((day) => day.calories + day.activityCalories), summary.week.dailyGoal, 1); return (
{summary.days.map((day) => { const height = Math.max(8, Math.round((day.calories / maxCalories) * 100)); const activityHeight = Math.round((day.activityCalories / maxCalories) * 100); return (
{activityHeight > 0 ? (
) : null}

{formatDate(day.date)}

); })}
); } function ProjectionCard({ summary }: { summary: HealthStatsSummary }) { if (!summary.projection) { return (

Prognose

Noch zu wenig Gewichtsdaten für eine faire Prognose. Ab drei Messungen über mindestens eine Woche wird hier ein vorsichtiger Trend angezeigt.

); } return (

Prognose

{summary.projection.message}

{summary.projection.targetDate ? (

Hochrechnung Zieltermin: {new Date(`${summary.projection.targetDate}T12:00:00`).toLocaleDateString("de-DE", { day: "2-digit", month: "long", year: "numeric" })}

) : null}

Vertrauen: {summary.projection.confidence === "medium" ? "mittel" : "niedrig"} · nur als Orientierung, nicht als Urteil.

); } export default function StatistikenPage() { const summaryQuery = trpc.health.statsSummary.useQuery({ referenceDate: todayKey() }); const summary = summaryQuery.data as HealthStatsSummary | undefined; const weekStatus = useMemo(() => { if (!summary) return "Sammelt Daten"; if (summary.week.balance > 800) return "entspannt im Rahmen"; if (summary.week.balance >= -300) return "ziemlich genau auf Kurs"; return "leicht über Plan, gut ausgleichbar"; }, [summary]); if (!summary) { return
Statistiken werden geladen...
; } return (

Statistiken

Fortschritt, der sich gut anfühlt

Trends, kleine Siege und Prognosen, wenn die Daten dafür stark genug sind.

14-Tage-Verlauf

Schwarz: Essen/Planung · Grün: Sportbonus

Ø {summary.averages.calories.toLocaleString("de-DE")} kcal

Kleine Siege

{summary.wins.map((win) => (

{win}

))}

Wochenbudget

{summary.week.plannedBudget.toLocaleString("de-DE")}

geplantes Budget

{summary.week.eatenCalories.toLocaleString("de-DE")}

gegessen/geplant

+{summary.week.activityCalories.toLocaleString("de-DE")}

Sportbonus

{summary.week.availableCalories.toLocaleString("de-DE")}

Restbudget

); }