import { Box, Button, Chip, Divider, Paper, Typography } from '@mui/material'
import { ArrowRight, Building2, TrendingUp, Zap } from 'lucide-react'
import { useNavigate } from 'react-router'
import { useSupplyDashboard } from '../../hooks/useSupplyDashboard'
import { useSessionStore } from '../../stores/sessionStore'
import { UserRole } from '../../domain/enums'
import { DashboardHeader, ReviewTaskWidget, DashboardSkeleton } from '../../components/supply'
import { DS_BG, DS_BORDER, DS_SURFACE, DS_TEXT } from '../../lib/ds'
export default function SupplyDashboard() {
const { data, isLoading, isError, refetch } = useSupplyDashboard()
const { currentUser } = useSessionStore()
const navigate = useNavigate()
const role = currentUser?.role ?? UserRole.DEMAND_USER
const isReviewer = role === UserRole.REVIEWER
if (isLoading) return
if (isError) {
return (
Dashboard konnte nicht geladen werden
Der Service ist vorübergehend nicht verfügbar.
)
}
if (!data || data.totalProperties === 0) {
return (
Noch keine Objekte vorhanden
Fügen Sie Ihr erstes Objekt hinzu — wir matchen es sofort mit aktiven Suchanfragen.
)
}
const strongMatchCount = data.strongMatchCount ?? 0
const topMatches = data.strongMatches ?? []
const futureSignalCount = data.futureSignals?.total ?? 0
return (
{/* ── Hero: Nachfrage-Intelligence ── */}
{/* KPI strip */}
{/* Starke Matches */}
0 ? DS_SURFACE.success.bg : 'white' }}>
0 ? DS_TEXT.success : DS_TEXT.muted} />
0 ? DS_TEXT.success : DS_TEXT.muted, fontWeight: 700, lineHeight: 1 }}>
Starke Match-Anfragen
0 ? DS_TEXT.success : DS_TEXT.disabled, lineHeight: 1 }}>
{strongMatchCount}
qualifizierte Interessenten ≥ 80%
{/* Aktive Objekte */}
navigate('/supply/properties')}>
Aktive Objekte
{data.activeProperties}
/ {data.totalProperties}
verfügbar · im Bestand
{/* Zukunftssignale */}
0 ? '#faf5ff' : 'white' }}>
0 ? '#7c3aed' : DS_TEXT.muted} />
0 ? '#7c3aed' : DS_TEXT.muted, fontWeight: 700, lineHeight: 1 }}>
Zukunftssignale
0 ? '#7c3aed' : DS_TEXT.disabled, lineHeight: 1 }}>
{futureSignalCount}
vorqualifizierte Nachfrage-Signale
{/* ── Top matches list ── */}
{topMatches.length > 0 && (
<>
Stärkste Interessenten
{topMatches.slice(0, 4).map((m, i) => (
0 ? `1px solid ${DS_BORDER.muted}` : undefined,
cursor: 'pointer',
'&:hover': { bgcolor: DS_BG.subtle },
}}
onClick={() => navigate('/supply/match-center')}
>
= 80 ? DS_SURFACE.success.bg : DS_SURFACE.warning.bg,
border: `1px solid ${m.matchScore >= 80 ? DS_SURFACE.success.border : DS_SURFACE.warning.border}`,
display: 'flex', alignItems: 'center', justifyContent: 'center',
}}>
= 80 ? DS_TEXT.success : DS_TEXT.warning }}>
{m.matchScore}%
{m.propertyTitle}
{m.topReason}
))}
>
)}
{/* ── Datenpflege (sekundär, collapsed) ── */}
{(data.dataQuality?.critical ?? 0) > 0 && (
{data.dataQuality!.critical} Objekte mit Datenlücken
Vollständige Daten verbessern die Match-Qualität erheblich.
)}
{isReviewer && data.reviewTasks !== null && (
navigate('/ops/review-queue')}
/>
)}
)
}