import { Box, Typography, Skeleton } from '@mui/material' import { AlertOctagon, Calendar, CalendarDays, Eye } from 'lucide-react' import { useShallow } from 'zustand/react/shallow' import { useReminderInsights } from '../../hooks/useReminders' import { useReminderStore } from '../../stores/reminderStore' import type { FilterHorizon } from '../../stores/reminderStore' import { ReminderType } from '../../domain/reminder' interface SecondaryKpiProps { icon: React.ReactNode label: string value: number | string color: string active: boolean onClick: () => void } function SecondaryKpi({ icon, label, value, color, active, onClick }: SecondaryKpiProps) { return ( {icon} {value} {label} ) } export function ReminderKpiBar() { const { data, isLoading } = useReminderInsights() const { filterHorizon, setFilterHorizon, filterType, setFilterType } = useReminderStore( useShallow(s => ({ filterHorizon: s.filterHorizon, setFilterHorizon: s.setFilterHorizon, filterType: s.filterType, setFilterType: s.setFilterType, })) ) function toggleHorizon(h: FilterHorizon) { if (filterHorizon === h) setFilterHorizon('ALL') else { setFilterHorizon(h); setFilterType('ALL') } } function togglePreMarket() { if (filterType === ReminderType.SCHATTENMARKT_RELEASE) setFilterType('ALL') else { setFilterType(ReminderType.SCHATTENMARKT_RELEASE); setFilterHorizon('ALL') } } if (isLoading) { return ( {[1, 2, 3].map(i => )} ) } const ins = data ?? { overdueCount: 0, dueThisWeek: 0, dueThisMonth: 0, schattenmarktReadyCount: 0 } const isOverdue = ins.overdueCount > 0 const overdueActive = filterHorizon === 'OVERDUE' return ( {/* Focal card — Überfällig */} toggleHorizon('OVERDUE')} sx={{ flex: '0 0 200px', px: 2.5, py: 2, display: 'flex', flexDirection: 'column', justifyContent: 'center', gap: 0.5, borderRadius: 1.5, cursor: 'pointer', border: overdueActive ? '1.5px solid #dc2626' : isOverdue ? '1.5px solid #fca5a5' : '1px solid #e8e7e4', bgcolor: overdueActive ? '#fef2f2' : isOverdue ? '#fff5f5' : 'white', transition: 'border-color 0.15s, background 0.15s', '&:hover': { borderColor: '#dc2626', bgcolor: '#fef2f2' }, }} > {ins.overdueCount} Überfällig {/* Secondary KPIs */} } label="Diese Woche" value={ins.dueThisWeek} color="#ea580c" active={filterHorizon === 'THIS_WEEK'} onClick={() => toggleHorizon('THIS_WEEK')} /> } label="Dieser Monat" value={ins.dueThisMonth} color="#0369a1" active={filterHorizon === 'THIS_MONTH'} onClick={() => toggleHorizon('THIS_MONTH')} /> } label="Pre-Market Risiko" value={ins.schattenmarktReadyCount} color="#be185d" active={filterType === ReminderType.SCHATTENMARKT_RELEASE} onClick={togglePreMarket} /> ) }