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'}

); }