import { MetricCard } from "./MetricCard"; import { Activity, AlertTriangle, Clock, TimerIcon } from "lucide-react"; import type { OverviewMetricsResponse } from "@/integrations/trpc/routers/overview"; import { formatDuration, formatThroughput } from "@bullstudio/ui/shared"; type MetricCardsGridProps = { summary: OverviewMetricsResponse["summary"]; timeSeries: OverviewMetricsResponse["timeSeries"]; timeRange: number; }; function calculateTrend( data: number[] ): { value: number; direction: "up" | "down" | "neutral" } { if (data.length < 4) return { value: 0, direction: "neutral" }; const midpoint = Math.floor(data.length / 2); const recentData = data.slice(midpoint); const previousData = data.slice(0, midpoint); const recent = recentData.reduce((a, b) => a + b, 0) / recentData.length; const previous = previousData.reduce((a, b) => a + b, 0) / previousData.length; if (previous === 0) return { value: 0, direction: "neutral" }; const change = ((recent - previous) / previous) * 100; return { value: Math.abs(Math.round(change)), direction: change > 5 ? "up" : change < -5 ? "down" : "neutral", }; } export function MetricCardsGrid({ summary, timeSeries, timeRange, }: MetricCardsGridProps) { const throughputSparkline = timeSeries.map((point) => ({ value: point.completed + point.failed, })); const failureSparkline = timeSeries.map((point) => { const total = point.completed + point.failed; return { value: total > 0 ? (point.failed / total) * 100 : 0, }; }); const processingTimeSparkline = timeSeries.map((point) => ({ value: point.avgProcessingTimeMs, })); const delaySparkline = timeSeries.map((point) => ({ value: point.avgDelayMs, })); const throughputTrend = calculateTrend( throughputSparkline.map((d) => d.value) ); const failureTrend = calculateTrend(failureSparkline.map((d) => d.value)); const processingTimeTrend = calculateTrend( processingTimeSparkline.map((d) => d.value) ); const delayTrend = calculateTrend(delaySparkline.map((d) => d.value)); const totalJobs = summary.totalCompleted + summary.totalFailed; return (