import { useMemo, useCallback } from 'react' import { Box, Chip, Typography } from '@mui/material' import { useReminders } from '../../hooks/useReminders' import { useShallow } from 'zustand/react/shallow' import { useReminderStore } from '../../stores/reminderStore' import { ReminderListRow } from './ReminderListRow' import { ReminderCard } from './ReminderCard' import { ReminderSkeleton } from './ReminderSkeleton' import { ReminderEmptyState } from './ReminderEmptyState' import type { Reminder } from '../../domain/reminder' import { ReminderStatus } from '../../domain/reminder' import type { FilterHorizon } from '../../stores/reminderStore' const MOCK_TODAY = new Date('2026-05-20') function getHorizon(dueDate: string): FilterHorizon { const days = Math.ceil((new Date(dueDate).getTime() - MOCK_TODAY.getTime()) / (1000 * 60 * 60 * 24)) if (days <= 0) return 'OVERDUE' if (days <= 7) return 'THIS_WEEK' if (days <= 30) return 'THIS_MONTH' return 'LATER' } const HORIZON_CONFIG: { key: FilterHorizon; label: string; color: string; bg: string; border: string }[] = [ { key: 'OVERDUE', label: 'Überfällig', color: '#dc2626', bg: '#fef2f2', border: '#fecaca' }, { key: 'THIS_WEEK', label: 'Diese Woche', color: '#ea580c', bg: '#fff7ed', border: '#fed7aa' }, { key: 'THIS_MONTH', label: 'Dieser Monat', color: '#0369a1', bg: '#f0f9ff', border: '#bae6fd' }, { key: 'LATER', label: 'Später', color: '#64748b', bg: '#f8fafc', border: '#e8e7e4' }, ] const LIST_COLS = '90px 130px 1fr 140px 80px 90px' function applyFilters( reminders: Reminder[], filterType: string, filterStatus: string, filterHorizon: string, searchQuery: string, ): Reminder[] { return reminders.filter(r => { if (filterStatus === 'ACTIVE') { if (r.status !== ReminderStatus.ACTIVE && r.status !== ReminderStatus.SNOOZED) return false } else if (filterStatus !== 'ALL') { if (r.status !== filterStatus) return false } if (filterType !== 'ALL' && r.type !== filterType) return false if (filterHorizon !== 'ALL' && getHorizon(r.dueDate) !== filterHorizon) return false if (searchQuery) { const q = searchQuery.toLowerCase() const hay = `${r.propertyTitle} ${r.propertyCity} ${r.tenantName}`.toLowerCase() if (!hay.includes(q)) return false } return true }) } export function ReminderFeed() { const { data, isLoading } = useReminders() const { filterType, filterStatus, filterHorizon, searchQuery, viewMode, setFilterType, setFilterStatus, setFilterHorizon, setSearchQuery, } = useReminderStore(useShallow(s => ({ filterType: s.filterType, filterStatus: s.filterStatus, filterHorizon: s.filterHorizon, searchQuery: s.searchQuery, viewMode: s.viewMode, setFilterType: s.setFilterType, setFilterStatus: s.setFilterStatus, setFilterHorizon: s.setFilterHorizon, setSearchQuery: s.setSearchQuery, }))) const reminders = data ?? [] const filtered = useMemo( () => applyFilters(reminders, filterType, filterStatus, filterHorizon, searchQuery), [reminders, filterType, filterStatus, filterHorizon, searchQuery], ) const grouped = useMemo(() => { const map: Record = { OVERDUE: [], THIS_WEEK: [], THIS_MONTH: [], LATER: [], } filtered.forEach(r => map[getHorizon(r.dueDate)].push(r)) return map }, [filtered]) const resetFilters = useCallback(() => { setFilterType('ALL') setFilterStatus('ACTIVE') setFilterHorizon('ALL') setSearchQuery('') }, [setFilterType, setFilterStatus, setFilterHorizon, setSearchQuery]) if (isLoading) return if (filtered.length === 0) return if (viewMode === 'card') { return ( {HORIZON_CONFIG.map(({ key, label, color }) => { const group = grouped[key] if (!group || group.length === 0) return null return ( {label} {group.map(r => )} ) })} ) } return ( {/* Table header */} {['Priorität', 'Typ', 'Objekt / Mieter', 'Fälligkeit', 'Status', 'Aktionen'].map(h => ( {h} ))} {/* Grouped rows */} {HORIZON_CONFIG.map(({ key, label, color, bg, border }) => { const group = grouped[key] if (!group || group.length === 0) return null return ( {/* Section divider */} {label} {/* Rows */} {group.map(r => )} ) })} ) }