import { useState } from 'react'; import { useLocation, Link } from 'react-router-dom'; import { ArrowLeft, Download, FileText } from 'lucide-react'; import { Card, CardContent, CardHeader, CardTitle } from '@/components/ui/card'; import { Button } from '@/components/ui/button'; import { Badge } from '@/components/ui/badge'; import { useComparisonCache } from '@/hooks/useComparison'; import { ComparisonBarChart, GroupedComparisonChart } from '@/components/charts'; import { formatCurrency, formatNumber } from '@/components/charts/chart-utils'; import { Skeleton } from '@/components/ui/skeleton'; interface LocationState { scenarioIds: string[]; } interface MetricRow { key: string; name: string; isCurrency: boolean; values: number[]; } export function Compare() { const location = useLocation(); const { scenarioIds } = (location.state as LocationState) || { scenarioIds: [] }; const [selectedMetric, setSelectedMetric] = useState('total_cost'); const { data, isLoading, error } = useComparisonCache(scenarioIds); if (!scenarioIds || scenarioIds.length < 2) { return (

Select 2-4 scenarios to compare

); } if (isLoading) { return (
); } if (error) { return (

Failed to load comparison

); } const scenarios = data?.scenarios || []; // Prepare metric rows for table const metricRows: MetricRow[] = [ { key: 'total_cost', name: 'Total Cost', isCurrency: true, values: [] }, { key: 'total_requests', name: 'Total Requests', isCurrency: false, values: [] }, { key: 'sqs_blocks', name: 'SQS Blocks', isCurrency: false, values: [] }, { key: 'lambda_invocations', name: 'Lambda Invocations', isCurrency: false, values: [] }, { key: 'llm_tokens', name: 'LLM Tokens', isCurrency: false, values: [] }, { key: 'pii_violations', name: 'PII Violations', isCurrency: false, values: [] }, ]; metricRows.forEach((row) => { row.values = scenarios.map((s) => { const metric = s.summary[row.key as keyof typeof s.summary]; return typeof metric === 'number' ? metric : 0; }); }); // Calculate deltas for each metric const getDelta = (metric: MetricRow, index: number) => { if (index === 0) return null; const baseline = metric.values[0]; const current = metric.values[index]; const diff = current - baseline; const percentage = baseline !== 0 ? (diff / baseline) * 100 : 0; return { diff, percentage }; }; // Color coding: green for better, red for worse, gray for neutral const getDeltaColor = (metric: MetricRow, delta: { diff: number; percentage: number }) => { if (metric.key === 'total_cost' || metric.key === 'pii_violations') { // Lower is better return delta.diff < 0 ? 'text-green-500' : delta.diff > 0 ? 'text-red-500' : 'text-gray-500'; } // Higher is better return delta.diff > 0 ? 'text-green-500' : delta.diff < 0 ? 'text-red-500' : 'text-gray-500'; }; const metricOptions = [ { key: 'total_cost', name: 'Total Cost', isCurrency: true }, { key: 'total_requests', name: 'Total Requests', isCurrency: false }, { key: 'sqs_blocks', name: 'SQS Blocks', isCurrency: false }, { key: 'lambda_invocations', name: 'Lambda Invocations', isCurrency: false }, { key: 'llm_tokens', name: 'LLM Tokens', isCurrency: false }, ]; const currentMetric = metricOptions.find((m) => m.key === selectedMetric); // Prepare data for bar chart const chartScenarios = scenarios.map((s) => ({ scenario: s.scenario, metrics: metricRows.map((m) => ({ key: m.key, name: m.name, value: s.summary[m.key as keyof typeof s.summary] as number || 0, })), })); return (
{/* Header */}

Scenario Comparison

Comparing {scenarios.length} scenarios

{/* Scenario Cards */}
{scenarios.map((s) => ( {s.scenario.name}
{s.scenario.region} {s.scenario.status}

{formatCurrency(s.summary.total_cost_usd)}

{formatNumber(s.summary.total_requests)} requests

))}
{/* Charts */}
{/* Bar Chart */}
Comparison Chart
{/* Grouped Chart */} Multi-Metric Overview
{/* Comparison Table */} Detailed Comparison
{scenarios.map((s, i) => ( ))} {metricRows.map((metric) => ( {metric.values.map((value, index) => { const delta = getDelta(metric, index); return ( ); })} ))}
Metric {i === 0 && Baseline} {s.scenario.name}
{metric.name}
{metric.isCurrency ? formatCurrency(value) : formatNumber(value)}
{delta && (
{delta.percentage > 0 ? '+' : ''} {delta.percentage.toFixed(1)}%
)}
); }