import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card";
import { Skeleton } from "@/components/ui/skeleton";
import type { KpiMetrics } from "@/lib/types/alerts";
import { KPI_THRESHOLDS } from "@/lib/types/alerts";
import { cn } from "@/lib/utils";
interface KpiDashboardProps {
kpis: KpiMetrics | null;
isLoading?: boolean;
}
export function KpiDashboard({ kpis, isLoading = false }: KpiDashboardProps) {
if (isLoading) {
return (
Alert Coverage Ratio
False Positive Rate
Uptime Ratio
Verdict
);
}
if (!kpis) {
return (
No KPI data available
);
}
const alertCoverageRatio = kpis.errorCoverageRatio;
const falsePositiveRate = kpis.invalidAlertRatio;
const MONTHS_MS = 30 * 24 * 60 * 60 * 1000 * 3; // 3 months
const uptimeRatio = ((MONTHS_MS - kpis.overallDowntimeMs) / MONTHS_MS) * 100;
const coveragePassed =
alertCoverageRatio >= KPI_THRESHOLDS.alertCoverageRatio;
const fpPassed = falsePositiveRate <= KPI_THRESHOLDS.falsePositiveRate;
const uptimePassed = uptimeRatio >= KPI_THRESHOLDS.uptimeRatio;
const isEffective = coveragePassed && fpPassed && uptimePassed;
const coverageColor = coveragePassed ? "text-green-500" : "text-destructive";
const fpColor = fpPassed ? "text-green-500" : "text-destructive";
const uptimeColor = uptimePassed ? "text-green-500" : "text-destructive";
return (
Alert Coverage Ratio
≥{KPI_THRESHOLDS.alertCoverageRatio}%
{alertCoverageRatio.toFixed(1)}%
{kpis.coveredIncidents} of {kpis.totalIncidents} incidents
False Positive Rate
≤{KPI_THRESHOLDS.falsePositiveRate}%
{falsePositiveRate.toFixed(1)}%
{kpis.invalidAlerts} of {kpis.totalFiringAlerts} alerts
Uptime Ratio
≥{KPI_THRESHOLDS.uptimeRatio}%
{uptimeRatio.toFixed(2)}%
Downtime: {kpis.overallDowntimeFormatted}
Verdict
{isEffective ? "EFFECTIVE" : "NOT EFFECTIVE"}
{[coveragePassed, fpPassed, uptimePassed].filter(Boolean).length}/3
KPIs passed
);
}