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}
)
}