"use client" import { useEffect, useState } from "react" import { useAuth } from "@/lib/auth" import { apiFetch, IDashboardStats } from "@/lib/api" import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card" import { DashboardSkeleton } from "@/components/ui/skeletons" import { FadeIn, StaggeredList, listItemVariants, CardHover } from "@/components/ui/animations" import { motion } from "framer-motion" import { Users, UserCog, CalendarDays, BookOpen, TrendingUp, Trophy } from "lucide-react" import { Badge } from "@/components/ui/badge" const groupConfig = { kids: { label: "Kinder", color: "bg-blue-500", bgColor: "bg-blue-500/10", textColor: "text-blue-500" }, youth: { label: "Jugend", color: "bg-purple-500", bgColor: "bg-purple-500/10", textColor: "text-purple-500" }, adults: { label: "Erwachsene", color: "bg-orange-500", bgColor: "bg-orange-500/10", textColor: "text-orange-500" }, inactive: { label: "Inaktiv", color: "bg-gray-400", bgColor: "bg-gray-400/10", textColor: "text-gray-500" }, } const groupOrder = ["kids", "youth", "adults", "inactive"] as const export default function DashboardPage() { const { token, user } = useAuth() const [stats, setStats] = useState(null) const [isLoading, setIsLoading] = useState(true) useEffect(() => { if (!token) return const fetchStats = async () => { setIsLoading(true) try { const data = await apiFetch('/stats/dashboard/', { token }) setStats(data) } catch (error) { console.error("Failed to fetch stats:", error) } finally { setIsLoading(false) } } fetchStats() }, [token]) if (isLoading) { return } const maxActivity = stats?.activity ? Math.max(...stats.activity.map(a => a.count), 1) : 1 return (

Dashboard

Willkommen zurück, {user?.username}

Ringer
{stats?.wrestlers.total || 0}

+{stats?.wrestlers.this_week || 0} diese Woche

Trainer
{stats?.trainers.total || 0}

Aktiv: {stats?.trainers.active || 0}

Trainings
{stats?.trainings.total || 0}

+{stats?.trainings.this_week || 0} diese Woche

Hausaufgaben
{stats?.homework.open || 0}

offen

Teilnahme diese Woche {groupOrder.filter(g => g !== "inactive").map((group) => { const data = stats?.attendance.this_week[group] const config = groupConfig[group] return (
{config.label}
{data?.attended || 0}/{data?.total || 0}
) })}
Ø Teilnehmer {stats?.attendance.average || 0}/{stats?.attendance.expected || 0}
Training Aktivität
{stats?.activity.map((day, i) => (
))}

Letzte 14 Tage

Hausaufgaben Erledigung
{stats?.homework.completed || 0} ({stats?.homework.completed ? Math.round(stats.homework.completed / (stats.homework.open + stats.homework.completed) * 100) : 0}%)
Offen: {stats?.homework.open || 0} Erledigt: {stats?.homework.completed || 0}
Ringer nach Gruppe {groupOrder.map((group) => { const count = stats?.wrestlers_by_group[group] || 0 const config = groupConfig[group] const total = stats?.wrestlers.total || 1 return (
{config.label}
{count}
) })} Top Trainer {stats?.top_trainers && stats.top_trainers.length > 0 ? ( stats.top_trainers.map((trainer, i) => (
{i + 1}
{trainer.name} {trainer.training_count} Training
)) ) : (

Keine Trainer vorhanden

)}
) }