import { DemandSignal, DemandItem } from '../../lib/demand/types'; interface DemandSignalCardProps { signal: DemandSignal; onViewDetails?: () => void; } const STATUS_COLORS: Record = { surplus: { bg: 'bg-green-100', text: 'text-green-800', icon: '📈' }, balanced: { bg: 'bg-blue-100', text: 'text-blue-800', icon: '⚖️' }, shortage: { bg: 'bg-yellow-100', text: 'text-yellow-800', icon: '⚠️' }, critical: { bg: 'bg-red-100', text: 'text-red-800', icon: '🚨' }, }; function formatCategory(category: string): string { return category.replace(/_/g, ' ').replace(/\b\w/g, (l) => l.toUpperCase()); } export default function DemandSignalCard({ signal, onViewDetails }: DemandSignalCardProps) { const statusStyle = STATUS_COLORS[signal.supplyStatus]; // Get top demand items const topItems = [...signal.demandItems] .sort((a, b) => b.weeklyDemandKg - a.weeklyDemandKg) .slice(0, 5); const gapPercentage = signal.totalWeeklyDemandKg > 0 ? (signal.supplyGapKg / signal.totalWeeklyDemandKg) * 100 : 0; return (
{/* Header */}

{signal.region.name}

{signal.seasonalPeriod.charAt(0).toUpperCase() + signal.seasonalPeriod.slice(1)} Season

{statusStyle.icon} {signal.supplyStatus.charAt(0).toUpperCase() + signal.supplyStatus.slice(1)}
{/* Key metrics */}

{signal.totalConsumers}

Consumers

{signal.totalWeeklyDemandKg.toFixed(0)}

Weekly Demand (kg)

{signal.currentSupplyKg.toFixed(0)}

Current Supply (kg)

{/* Supply Gap Indicator */}
Supply Coverage 20 ? 'text-red-600' : 'text-green-600'}`}> {(100 - gapPercentage).toFixed(0)}% covered
50 ? 'bg-red-500' : gapPercentage > 20 ? 'bg-yellow-500' : 'bg-green-500' }`} style={{ width: `${Math.min(100 - gapPercentage, 100)}%` }} >
{signal.supplyGapKg > 0 && (

Gap: {signal.supplyGapKg.toFixed(0)} kg needed

)}
{/* Top Demand Items */}

Top Demanded Items

{topItems.map((item, index) => ( ))}
{/* Confidence indicator */}
Confidence:
{[1, 2, 3, 4, 5].map((level) => (
))}
{signal.confidenceLevel}%
Updated: {new Date(signal.timestamp).toLocaleDateString()}
{/* View Details Button */} {onViewDetails && ( )}
); } function DemandItemRow({ item, rank }: { item: DemandItem; rank: number }) { const urgencyColors: Record = { immediate: 'bg-red-100 text-red-700', this_week: 'bg-orange-100 text-orange-700', this_month: 'bg-yellow-100 text-yellow-700', next_season: 'bg-blue-100 text-blue-700', }; return (
{rank}

{item.produceType}

{formatCategory(item.category)}

{item.weeklyDemandKg.toFixed(1)} kg

{item.urgency.replace(/_/g, ' ')}
{item.inSeason && ( 🌿 )}
); }