import { useState } from 'react';
import { useParams, Link } from 'react-router-dom';
import { FileText, ArrowLeft, Play, Square, BarChart3, PieChart, Activity } from 'lucide-react';
import { useScenario, useStartScenario, useStopScenario } from '@/hooks/useScenarios';
import { useMetrics } from '@/hooks/useMetrics';
import { Badge } from '@/components/ui/badge';
import { Button } from '@/components/ui/button';
import { Card, CardContent, CardHeader, CardTitle, CardDescription } from '@/components/ui/card';
import { Tabs, TabsContent, TabsList, TabsTrigger } from '@/components/ui/tabs';
import { CostBreakdownChart, TimeSeriesChart } from '@/components/charts';
import { formatCurrency, formatNumber } from '@/components/charts/ChartContainer';
import { Skeleton } from '@/components/ui/skeleton';
const statusColors = {
draft: 'secondary',
running: 'default',
completed: 'outline',
archived: 'destructive',
} as const;
interface TimeSeriesDataPoint {
timestamp: string;
[key: string]: string | number;
}
export function ScenarioDetail() {
const { id } = useParams<{ id: string }>();
const { data: scenario, isLoading: isLoadingScenario } = useScenario(id || '');
const { data: metrics, isLoading: isLoadingMetrics } = useMetrics(id || '');
const [activeTab, setActiveTab] = useState('overview');
const startScenario = useStartScenario(id || '');
const stopScenario = useStopScenario(id || '');
const handleStart = () => startScenario.mutate();
const handleStop = () => stopScenario.mutate();
if (isLoadingScenario || isLoadingMetrics) {
return (
{[...Array(4)].map((_, i) => (
))}
);
}
if (!scenario) {
return (
Scenario not found
);
}
// Prepare time series data
const timeseriesData = metrics?.timeseries?.map((point) => ({
timestamp: point.timestamp,
value: point.value,
metric_type: point.metric_type,
})) || [];
// Group time series by metric type
const groupedTimeseries = timeseriesData.reduce((acc, point) => {
if (!acc[point.metric_type]) {
acc[point.metric_type] = [];
}
acc[point.metric_type].push(point);
return acc;
}, {} as Record);
// Transform for chart
const chartData: TimeSeriesDataPoint[] = Object.keys(groupedTimeseries).length > 0
? groupedTimeseries[Object.keys(groupedTimeseries)[0]].map((point, index) => {
const dataPoint: TimeSeriesDataPoint = {
timestamp: point.timestamp,
};
Object.keys(groupedTimeseries).forEach((type) => {
const typeData = groupedTimeseries[type];
dataPoint[type] = typeData[index]?.value || 0;
});
return dataPoint;
})
: [];
const timeSeriesSeries = Object.keys(groupedTimeseries).map((type, index) => ({
key: type,
name: type.replace(/_/g, ' ').toUpperCase(),
color: ['#3B82F6', '#10B981', '#F59E0B', '#EF4444', '#8B5CF6'][index % 5],
type: 'line' as const,
}));
return (
{/* Header */}
{scenario.name}
{scenario.status}
{scenario.description}
Region: {scenario.region}
•
Created: {new Date(scenario.created_at).toLocaleDateString()}
{scenario.status === 'draft' && (
)}
{scenario.status === 'running' && (
)}
{/* Stats Cards */}
Total Requests
{formatNumber(metrics?.summary.total_requests || 0)}
Total Cost
{formatCurrency(metrics?.summary.total_cost_usd || 0)}
SQS Blocks
{formatNumber(metrics?.summary.sqs_blocks || 0)}
Lambda Invocations
{formatNumber(metrics?.summary.lambda_invocations || 0)}
{/* Tabs */}
Overview
Metrics
Analysis
{/* Cost Breakdown Chart */}
{metrics?.cost_breakdown && metrics.cost_breakdown.length > 0 && (
)}
{/* Summary Card */}
Additional Metrics
Detailed breakdown of scenario metrics
LLM Tokens
{formatNumber(metrics?.summary.llm_tokens || 0)}
PII Violations
{formatNumber(metrics?.summary.pii_violations || 0)}
Avg Cost per Request
{metrics?.summary.total_requests
? formatCurrency(metrics.summary.total_cost_usd / metrics.summary.total_requests)
: '$0.0000'}
Status
{scenario.status}
{chartData.length > 0 ? (
) : (
No time series data available yet
)}
Analysis
Advanced analysis and insights
Cost Efficiency
{metrics?.summary.total_requests
? `Average cost per request: ${formatCurrency(
metrics.summary.total_cost_usd / metrics.summary.total_requests
)}`
: 'No request data available'}
PII Risk Assessment
{metrics?.summary.pii_violations
? `${metrics.summary.pii_violations} potential PII violations detected`
: 'No PII violations detected'}
);
}