import { useState } from 'react' import { Drawer, Box, Typography, IconButton, Chip, Divider, TextField, Button, Select, MenuItem, FormControl, InputLabel, Autocomplete, } from '@mui/material' import { X, Calendar, Activity, FileText, ExternalLink, Eye } from 'lucide-react' import { useReminderStore } from '../../stores/reminderStore' import { useReminder, useCompleteReminder, useDismissReminder, useSnoozeReminder, useCreateReminder, } from '../../hooks/useReminders' import { usePropertyById, useProperties } from '../../hooks/useProperties' import { ReminderPriorityBadge } from './ReminderPriorityBadge' import { ReminderTypeBadge } from './ReminderTypeBadge' import { ReminderDaysIndicator } from './ReminderDaysIndicator' import { ReminderStatus, ReminderType, ReminderPriority } from '../../domain/reminder' import type { Property } from '../../domain/property' import { SHADOW_RISK_COLOR, SHADOW_RISK_LABEL, STATUS_CHIP_COLOR, STATUS_LABEL, SectionTitle, DateRow, ActivityEntry, } from './reminderDetailHelpers' // ── Constants ──────────────────────────────────────────────────────────────── const TYPE_LABELS: Record = { LEASE_EXPIRY: 'Mietablauf', BREAK_OPTION: 'Break-Option', RENT_REVIEW: 'Mietanpassung', INSPECTION: 'Inspektion', INSURANCE_RENEWAL: 'Versicherung', MAINTENANCE: 'Unterhalt', SCHATTENMARKT_RELEASE: 'Pre-Market', CUSTOM: 'Individuell', } const TYPE_SECOND_DATE: Partial> = { [ReminderType.LEASE_EXPIRY]: 'contractEndDate', [ReminderType.BREAK_OPTION]: 'breakOptionDate', [ReminderType.RENT_REVIEW]: 'eventDate', [ReminderType.SCHATTENMARKT_RELEASE]: 'eventDate', } const TYPE_SECOND_LABEL: Partial> = { [ReminderType.LEASE_EXPIRY]: 'Vertragsende', [ReminderType.BREAK_OPTION]: 'Break-Option', [ReminderType.RENT_REVIEW]: 'Ereignisdatum', [ReminderType.SCHATTENMARKT_RELEASE]: 'Ereignisdatum', } const MOCK_TODAY = new Date('2026-05-20') function calcPriority(dueDateStr: string): ReminderPriority { const days = Math.ceil((new Date(dueDateStr).getTime() - MOCK_TODAY.getTime()) / (1000 * 60 * 60 * 24)) if (days <= 14) return ReminderPriority.URGENT if (days <= 30) return ReminderPriority.HIGH if (days <= 60) return ReminderPriority.MEDIUM return ReminderPriority.LOW } // ── Create Form ─────────────────────────────────────────────────────────────── function CreateForm({ onClose }: { onClose: () => void }) { const { data: properties = [] } = useProperties() const create = useCreateReminder() const [type, setType] = useState(ReminderType.LEASE_EXPIRY) const [selectedProperty, setSelectedProperty] = useState(null) const [tenantName, setTenantName] = useState('') const [dueDate, setDueDate] = useState('') const [note, setNote] = useState('') function handlePropertyChange(_: unknown, prop: Property | null) { setSelectedProperty(prop) setTenantName(prop?.currentTenant ?? '') } function handleSubmit() { if (!selectedProperty || !dueDate) return create.mutate( { type, priority: calcPriority(dueDate), status: ReminderStatus.ACTIVE, propertyId: selectedProperty.id, propertyTitle: selectedProperty.title, propertyCity: selectedProperty.location.city, propertyDistrict: selectedProperty.location.district, tenantName: tenantName || '—', dueDate, eventDate: dueDate, areaSqm: selectedProperty.areaSqm, currentRentPerSqm: selectedProperty.rentPricePerSqm, currency: 'CHF', shadowMarketRisk: 'NONE', schattenmarktEnabled: false, note: note || undefined, organizationId: selectedProperty.organizationId ?? 'org-1', }, { onSuccess: onClose }, ) } const canSubmit = !!selectedProperty && !!dueDate && !create.isPending return ( {/* Typ */} Typ {/* Objekt */} p.title} value={selectedProperty} onChange={handlePropertyChange} size="small" renderInput={params => ( )} /> {/* Mieter — nur wenn Objekt ausgewählt */} {selectedProperty && ( setTenantName(e.target.value)} placeholder="Mietername eingeben…" /> )} {/* Fälligkeitsdatum */} setDueDate(e.target.value)} slotProps={{ inputLabel: { shrink: true } }} /> {/* Notiz */} setNote(e.target.value)} placeholder="Kontext oder Hinweise…" /> ) } // ── Main Drawer ─────────────────────────────────────────────────────────────── export function ReminderDetailDrawer() { const { selectedId, drawerOpen, setDrawerOpen, setSelectedId } = useReminderStore() const { data: reminder } = useReminder(selectedId ?? '') const { data: reminderProperty } = usePropertyById(reminder?.propertyId ?? '') const complete = useCompleteReminder() const dismiss = useDismissReminder() const snooze = useSnoozeReminder() const [noteValue, setNoteValue] = useState('') const [snoozeDate, setSnoozeDate] = useState('') function handleClose() { setDrawerOpen(false) setSelectedId(null) } const isCreateMode = !selectedId const secondDateKey = reminder ? TYPE_SECOND_DATE[reminder.type] : undefined const secondDateLabel = reminder ? TYPE_SECOND_LABEL[reminder.type] : undefined const secondDateValue = secondDateKey && reminder ? reminder[secondDateKey] : undefined const showSecondDate = secondDateValue && reminder && secondDateValue !== reminder.dueDate const showPreMarket = reminder && reminder.shadowMarketRisk !== 'NONE' && reminder.shadowMarketRisk !== 'LOW' const isActionable = reminder && (reminder.status === ReminderStatus.ACTIVE || reminder.status === ReminderStatus.SNOOZED) return ( {/* ── Header ── */} {isCreateMode ? ( Neuer Reminder ) : reminder ? ( <> ) : null} {/* ── Body ── */} {/* Create mode */} {isCreateMode && } {/* Detail mode */} {reminder && ( {/* 1. Objekt */} {reminder.propertyTitle} {reminder.propertyCity}{reminder.propertyDistrict ? ` · ${reminder.propertyDistrict}` : ''} · {reminder.tenantName} {reminderProperty?.leaseContractUrl ? ( ) : ( Kein Vertrag )} {showPreMarket && ( Pre-Mkt: {SHADOW_RISK_LABEL[reminder.shadowMarketRisk]} )} {/* 2. Fristen */} }>Fristen {showSecondDate && ( )} {reminder.snoozedUntil && ( )} {/* 3. Notiz */} Notiz setNoteValue(e.target.value)} placeholder="Notiz hinzufügen…" sx={{ '& .MuiInputBase-root': { fontSize: '0.8125rem' } }} /> {/* 4. Aktionen */} {isActionable && ( <> Aktionen setSnoozeDate(e.target.value)} sx={{ flex: 1, '& .MuiInputBase-root': { fontSize: '0.8125rem' } }} /> )} {/* 5. Verlauf */} }>Verlauf {[...reminder.activity].reverse().map((entry, i) => ( ))} )} ) }