import { Alert, Box, Button, Chip, Typography } from '@mui/material' import { CheckCircle2, Calendar, MapPin, Wallet, Info, Ruler, Sparkles } from 'lucide-react' import type { LatentNeed } from '../../domain/latentNeed' import { useOfferWizardStore } from '../../stores/offerWizardStore' import { useSessionStore } from '../../stores/sessionStore' import { assetTypeLabel, latentStatusBadge } from './latentNeedUtils' import { UserRole } from '../../domain/enums' interface PublicNeedDetailProps { need: LatentNeed } export function PublicNeedDetail({ need }: PublicNeedDetailProps) { const openWizard = useOfferWizardStore(s => s.open) const currentUser = useSessionStore(s => s.currentUser) const statusCfg = latentStatusBadge(need.status) const disabled = currentUser?.role === UserRole.OWNER_VIEWER || need.status !== 'public' return ( {/* Header */} {need.title} {need.tenantCompany && ( {need.tenantCompany} )} {/* AI Summary */} {need.aiSummary && ( } severity="info" sx={{ bgcolor: '#eff6ff', borderRadius: 1.5, border: '1px solid #bfdbfe', '& .MuiAlert-icon': { color: '#1d4ed8' }, '& .MuiAlert-message': { color: '#1e3a8a', fontSize: '0.875rem' }, }} > KI-Analyse {need.aiSummary} )} {/* Suchprofil grid */} Suchprofil } label="Standort" value={need.desiredLocation} /> } label="Fläche" value={`${need.sizeRange.min}–${need.sizeRange.max} m²`} /> } label="Budget" value={ need.budgetRange ? `${need.budgetRange.min ? `CHF ${need.budgetRange.min}` : 'flex'}–${ need.budgetRange.max ? `CHF ${need.budgetRange.max}` : 'flex' } /m²` : 'Flexibel' } /> } label="Timing" value={need.timing} /> {/* Must-have Kriterien */} {need.mustHaveCriteria.length > 0 && ( Must-have Kriterien {need.mustHaveCriteria.map((c, idx) => ( {c} ))} )} {/* Gewichtete Präferenzen */} {need.weightedPreferences.length > 0 && ( Gewichtete Präferenzen {need.weightedPreferences.map((p, idx) => { const pct = Math.round(p.weight * 100) return ( {p.criterion} {pct}% {p.description && ( {p.description} )} ) })} )} {disabled && need.status !== 'public' && ( } sx={{ fontSize: '0.8125rem' }}> Dieser Bedarf ist aktuell {statusCfg.label.toLowerCase()} — kein Angebot möglich. )} ) } function ProfileBox({ icon, label, value }: { icon: React.ReactNode; label: string; value: string }) { return ( {icon} {label} {value} ) }