import { Box, Button, Chip, Divider, Paper, Typography } from '@mui/material' import { BarChart2, Briefcase, ExternalLink, FileCheck, FileText, Newspaper, ShieldCheck, User, Zap, } from 'lucide-react' import type { Match } from '../../domain/match' import type { FutureSignal } from '../../domain/futureSignal' const SIGNAL_TYPE_LABELS: Record = { EXPANSION: 'Expansion', POSSIBLE_MOVE_OUT: 'Möglicher Auszug', CONSTRUCTION_PROJECT: 'Bauvorhaben', RESTRUCTURING: 'Restrukturierung', PROJECT_DEVELOPMENT: 'Projektentwicklung', SPACE_CONSOLIDATION: 'Flächenkonsolidierung', LEASE_EXPIRY: 'Vertragsende (Schattenmarkt)', } const SIGNAL_RELEVANCE_BRIDGE: Record = { EXPANSION: 'Ein Unternehmen sucht neue Flächen — Ihr Angebot könnte gefragt sein.', POSSIBLE_MOVE_OUT: 'Dieses Unternehmen könnte seinen Standort aufgeben — die Fläche wird für Sie verfügbar.', CONSTRUCTION_PROJECT:'Ein Neubau entsteht — neue Flächen könnten zur Vermietung angeboten werden.', RESTRUCTURING: 'Restrukturierung deutet auf Flächenänderungen hin.', PROJECT_DEVELOPMENT: 'Projektentwicklung könnte neue Gewerbeflächen schaffen.', SPACE_CONSOLIDATION: 'Konsolidierung — Teilflächen könnten frei werden.', LEASE_EXPIRY: 'Die Verwaltung hat dieses Objekt für den Markt freigegeben — Vertragsende bekannt und bestätigt.', } const SOURCE_META: Record = { JOB_POSTING: { label: 'Stelleninserate', icon: }, PRESS: { label: 'Pressebericht', icon: }, CONSTRUCTION_PERMIT: { label: 'Baubewilligung', icon: }, COMPANY_REPORT: { label: 'Geschäftsbericht', icon: }, MARKET_DATA: { label: 'Marktdaten', icon: }, MANUAL: { label: 'Analyst', icon: }, LEASE_CONTRACT: { label: 'Vertrag verifiziert (ERP)', icon: }, } const CREDIBILITY_META: Record = { HIGH: { label: 'Hohe Quellenqualität', color: '#1a7a4a' }, MEDIUM: { label: 'Mittlere Quellenqualität', color: '#d97706' }, LOW: { label: 'Niedrige Quellenqualität', color: '#c0392b' }, } const SENSITIVITY_META: Record = { CONFIDENTIAL: { label: 'Vertraulich', color: 'error' }, INTERNAL: { label: 'Intern', color: 'warning' }, PUBLIC: { label: 'Öffentlich', color: 'default' }, } interface Props { match: Match signal: FutureSignal | null } export function FutureAvailabilityContextPanel({ match: _match, signal }: Props) { if (!signal) return null const sourceMeta = SOURCE_META[signal.source.type] ?? null const credMeta = CREDIBILITY_META[signal.source.credibility] ?? null const sensitiveMeta = SENSITIVITY_META[signal.sensitivityLevel] ?? SENSITIVITY_META.PUBLIC const relevanceBridge = signal.signalType ? (SIGNAL_RELEVANCE_BRIDGE[signal.signalType] ?? null) : null const probPct = Math.round(signal.probability * 100) const isVerifiedContract = signal.isVerified && signal.source.type === 'LEASE_CONTRACT' return ( Schattenmarkt-Signal {signal.isVerified && ( Verifiziert )} {/* 1. Quelle & Verlässlichkeit — FIRST */} Quelle & Verlässlichkeit {sourceMeta && ( {sourceMeta.icon} {sourceMeta.label} )} {credMeta && ( {credMeta.label} )} {signal.source.publishedAt && ( Publiziert: {new Date(signal.source.publishedAt).toLocaleDateString('de-CH', { day: '2-digit', month: 'long', year: 'numeric' })} )} {isVerifiedContract && ( Vertragsende aus internem ERP bestätigt Verwaltung hat Marktfreigabe erteilt )} {signal.source.url && ( )} {signal.evidence?.sourceUrls && signal.evidence.sourceUrls.length > 0 && ( Weitere Belege ({signal.evidence.sourceUrls.length}) {signal.evidence.sourceUrls.map((url, i) => ( {url} ))} )} {/* 2. Signal-Kenndaten */} {signal.signalType && ( Signaltyp )} Wahrscheinlichkeit = 70 ? '#1a7a4a' : probPct >= 50 ? '#d97706' : '#c0392b' }}>{probPct}% Zeithorizont ~{signal.timeHorizonMonths} Monate {signal.areaSqmEstimate && ( Flächenschätzung ~{signal.areaSqmEstimate.toLocaleString('de-CH')} m² )} {/* 3. KI-Analyse */} {signal.aiSummary && ( KI-Analyse {signal.aiSummary} )} {/* 4. Relevance bridge */} {relevanceBridge && ( Warum erscheint dieses Signal in Ihrer Suche? {relevanceBridge} )} {/* 5. Evidence */} {signal.evidence?.summary && ( Evidenz {signal.evidence.summary} )} {/* 6. Vertraulichkeit */} Vertraulichkeit: {/* 7. Disclaimer — grey footnote */} {signal.disclaimer} ) }