"use client" import { useState, useMemo } from "react" import { Card, CardContent, CardDescription, CardHeader, CardTitle } from "@/components/ui/card" import { Badge } from "@/components/ui/badge" import { Progress } from "@/components/ui/progress" import { Button } from "@/components/ui/button" import { Tabs, TabsContent, TabsList, TabsTrigger } from "@/components/ui/tabs" import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from "@/components/ui/select" import { Checkbox } from "@/components/ui/checkbox" import { Popover, PopoverContent, PopoverTrigger } from "@/components/ui/popover" import { Trophy, Target, TrendingUp, BarChart3, Grid3X3, List, Filter, Brain, Shield, CheckCircle, ChevronDown } from "lucide-react" // Category mappings from schema const CATEGORY_NAMES: { [key: string]: string } = { 'language-communication': 'Language & Communication', 'social-intelligence': 'Social Intelligence & Interaction', 'problem-solving': 'Problem Solving', 'creativity-innovation': 'Creativity & Innovation', 'learning-memory': 'Learning & Memory', 'perception-vision': 'Perception & Vision', 'physical-manipulation': 'Physical Manipulation & Motor Skills', 'metacognition': 'Metacognition & Self-Awareness', 'robotic-intelligence': 'Robotic Intelligence & Autonomy', 'harmful-content': 'Harmful Content Generation', 'information-integrity': 'Information Integrity & Misinformation', 'privacy-data': 'Privacy & Data Protection', 'bias-fairness': 'Bias & Fairness', 'security-robustness': 'Security & Robustness', 'dangerous-capabilities': 'Dangerous Capabilities & Misuse', 'human-ai-interaction': 'Human-AI Interaction Risks', 'environmental-impact': 'Environmental & Resource Impact', 'economic-displacement': 'Economic & Labor Displacement', 'governance-accountability': 'Governance & Accountability', 'value-chain': 'Value Chain & Supply Chain Risks' } const CAPABILITY_CATEGORIES = [ 'language-communication', 'social-intelligence', 'problem-solving', 'creativity-innovation', 'learning-memory', 'perception-vision', 'physical-manipulation', 'metacognition', 'robotic-intelligence' ] const RISK_CATEGORIES = [ 'harmful-content', 'information-integrity', 'privacy-data', 'bias-fairness', 'security-robustness', 'dangerous-capabilities', 'human-ai-interaction', 'environmental-impact', 'economic-displacement', 'governance-accountability', 'value-chain' ] const MODALITIES = [ "Text", "Vision", "Audio", "Video", "Code", "Robotics/Action", "Other" ] interface Evaluation { id: string name: string organization: string overallScore: number modality: string[] submittedDate: string categoryEvaluations?: { [categoryId: string]: { benchmarkAnswers?: { [questionId: string]: string } processAnswers?: { [questionId: string]: string } } } } interface AnalyticsDashboardProps { evaluations?: Evaluation[] } export default function AnalyticsDashboard({ evaluations = [] }: AnalyticsDashboardProps) { const [loading, setLoading] = useState(false) // Filter states const [modalityFilter, setModalityFilter] = useState("all") const [organizationFilter, setOrganizationFilter] = useState("all") const [sortBy, setSortBy] = useState<"score" | "date" | "name">("score") const [viewMode, setViewMode] = useState<"grid" | "list">("list") // Category selection state const [selectedCategories, setSelectedCategories] = useState(Object.keys(CATEGORY_NAMES)) // Get unique organizations const ORGANIZATIONS = useMemo(() => Array.from(new Set(evaluations.map(e => e.organization))) , [evaluations]) // Calculate scores dynamically based on selected categories const recalculatedEvaluations = useMemo(() => { return evaluations.map(evaluation => { if (!evaluation.categoryEvaluations || selectedCategories.length === 0) { return { ...evaluation, overallScore: 0 } } const scores = selectedCategories.map(categoryId => { const categoryData = evaluation.categoryEvaluations?.[categoryId] if (!categoryData) return 0 // Count total questions and answered questions const benchmarkAnswers = categoryData.benchmarkAnswers || {} const processAnswers = categoryData.processAnswers || {} const allAnswers = { ...benchmarkAnswers, ...processAnswers } const totalQuestions = Object.keys(allAnswers).length if (totalQuestions === 0) return 0 // Count answered questions (not N/A, null, undefined, or empty) const answeredQuestions = Object.values(allAnswers).filter( (answer: any) => answer && answer !== "N/A" && String(answer).trim() !== "" ).length return (answeredQuestions / totalQuestions) * 100 }) const overallScore = scores.length > 0 ? scores.reduce((sum, score) => sum + score, 0) / scores.length : 0 return { ...evaluation, overallScore } }) }, [evaluations, selectedCategories]) // Apply filters const filteredEvaluations = useMemo(() => { return recalculatedEvaluations .filter(evaluation => { const matchesModality = modalityFilter === "all" || evaluation.modality.includes(modalityFilter) const matchesOrganization = organizationFilter === "all" || evaluation.organization === organizationFilter return matchesModality && matchesOrganization }) .sort((a, b) => { switch (sortBy) { case "score": return b.overallScore - a.overallScore case "date": return new Date(b.submittedDate).getTime() - new Date(a.submittedDate).getTime() case "name": return a.name.localeCompare(b.name) default: return 0 } }) }, [recalculatedEvaluations, modalityFilter, organizationFilter, sortBy]) // Calculate category data based on selected categories const categoryData = useMemo(() => { return selectedCategories.map(categoryId => { const scores = evaluations.map(evaluation => { const categoryData = evaluation.categoryEvaluations?.[categoryId] if (!categoryData) return 0 // Count total questions and answered questions const benchmarkAnswers = categoryData.benchmarkAnswers || {} const processAnswers = categoryData.processAnswers || {} const allAnswers = { ...benchmarkAnswers, ...processAnswers } const totalQuestions = Object.keys(allAnswers).length if (totalQuestions === 0) return 0 // Count answered questions (not N/A, null, undefined, or empty) const answeredQuestions = Object.values(allAnswers).filter( (answer: any) => answer && answer !== "N/A" && String(answer).trim() !== "" ).length return (answeredQuestions / totalQuestions) * 100 }) const averageScore = scores.length > 0 ? scores.reduce((sum, score) => sum + score, 0) / scores.length : 0 return { id: categoryId, name: CATEGORY_NAMES[categoryId], type: CAPABILITY_CATEGORIES.includes(categoryId) ? "capability" : "risk", averageScore, evaluationCount: evaluations.length } }) }, [evaluations, selectedCategories]) const getScoreBadgeVariant = (score: number) => { if (score >= 80) return "default" if (score >= 60) return "secondary" if (score >= 40) return "outline" return "destructive" } const getScoreColor = (score: number) => { if (score >= 80) return "text-green-600 dark:text-green-400" if (score >= 60) return "text-blue-600 dark:text-blue-400" if (score >= 40) return "text-yellow-600 dark:text-yellow-400" return "text-red-600 dark:text-red-400" } const handleCategoryToggle = (categoryId: string) => { setSelectedCategories(prev => prev.includes(categoryId) ? prev.filter(id => id !== categoryId) : [...prev, categoryId] ) } const selectAllCategories = () => { setSelectedCategories(Object.keys(CATEGORY_NAMES)) } const selectOnlyCapabilities = () => { setSelectedCategories(CAPABILITY_CATEGORIES) } const selectOnlyRisks = () => { setSelectedCategories(RISK_CATEGORIES) } const clearAllCategories = () => { setSelectedCategories([]) } if (loading) { return (

Loading analytics...

) } return (
{/* Overview Stats */}

{evaluations.length}

Total Evaluations

{filteredEvaluations.length > 0 ? Math.round(filteredEvaluations.reduce((sum, evaluation) => sum + evaluation.overallScore, 0) / filteredEvaluations.length) : 0}%

Average Score

{filteredEvaluations.length > 0 ? Math.round(Math.max(...filteredEvaluations.map(e => e.overallScore))) : 0}%

Highest Score

{selectedCategories.length}/{Object.keys(CATEGORY_NAMES).length}

Selected Categories

Overall Leaderboard Insights {/* Filters */}
Filters & View Filter and sort evaluation results
{/* Category Selection Dropdown */}
{/* Quick Actions */}
{/* Capabilities */}

Capabilities

{CAPABILITY_CATEGORIES.map(categoryId => (
handleCategoryToggle(categoryId)} />
))}
{/* Risks */}

Risks

{RISK_CATEGORIES.map(categoryId => (
handleCategoryToggle(categoryId)} />
))}
{/* Overall Leaderboard */} Overall Completeness Leaderboard Ranked by evaluation completeness score ({filteredEvaluations.length} {filteredEvaluations.length === 1 ? 'evaluation' : 'evaluations'}) {viewMode === "grid" ? (
{filteredEvaluations.map((evaluation, index) => ( {index < 3 && (
#{index + 1}
)}

{evaluation.name}

{evaluation.organization}

Completeness Score {Math.round(evaluation.overallScore)}%
{evaluation.modality.map(mod => ( {mod} ))}
Submitted: {new Date(evaluation.submittedDate).toLocaleDateString()}
))}
) : (
{filteredEvaluations.map((evaluation, index) => (
{/* Organization Logo/Icon */}
{evaluation.organization.charAt(0)}
{evaluation.organization}
{evaluation.name}
{/* Horizontal Bar Chart */}
{/* Progress Bar Container */}
{/* Background bar */}
{/* Progress bar */}
= 80 ? 'bg-purple-600' : evaluation.overallScore >= 60 ? 'bg-purple-500' : evaluation.overallScore >= 40 ? 'bg-purple-400' : 'bg-purple-300' }`} style={{ width: `${Math.max(evaluation.overallScore, 5)}%`, animationDelay: `${index * 100}ms` }} >
{/* Score */}
{Math.round(evaluation.overallScore)}%
{/* Modality badges - shown on hover */}
{evaluation.modality.slice(0, 3).map(mod => ( {mod} ))} {evaluation.modality.length > 3 && ( +{evaluation.modality.length - 3} )}
))}
)}
{/* Key Insights */}
Top Performing Categories Categories with highest average completeness from selected categories
{categoryData .sort((a, b) => b.averageScore - a.averageScore) .slice(0, 5) .map((category, index) => (
{index + 1}

{category.name}

{category.type}

{Math.round(category.averageScore)}%

))} {categoryData.length === 0 && (

No categories selected. Please select categories from the filters above.

)}
Areas for Improvement Categories with lowest average completeness from selected categories
{categoryData .sort((a, b) => a.averageScore - b.averageScore) .slice(0, 5) .map((category, index) => (
{index + 1}

{category.name}

{category.type}

{Math.round(category.averageScore)}%

))} {categoryData.length === 0 && (

No categories selected. Please select categories from the filters above.

)}
{/* Category Performance Breakdown */}
{/* Capabilities */} Capability Categories Average completeness by capability category
{categoryData .filter(cat => cat.type === "capability") .sort((a, b) => b.averageScore - a.averageScore) .map(category => (
{category.name} {Math.round(category.averageScore)}%
{category.evaluationCount} evaluation{category.evaluationCount !== 1 ? 's' : ''}
))} {categoryData.filter(cat => cat.type === "capability").length === 0 && (

No capability categories selected.

)}
{/* Risks */} Risk Categories Average completeness by risk category
{categoryData .filter(cat => cat.type === "risk") .sort((a, b) => b.averageScore - a.averageScore) .map(category => (
{category.name} {Math.round(category.averageScore)}%
{category.evaluationCount} evaluation{category.evaluationCount !== 1 ? 's' : ''}
))} {categoryData.filter(cat => cat.type === "risk").length === 0 && (

No risk categories selected.

)}
{/* Distribution Analysis */} Score Distribution Breakdown of evaluation completeness scores based on current filters and selected categories
{[ { range: "80-100%", color: "bg-green-500", count: filteredEvaluations.filter(e => e.overallScore >= 80).length }, { range: "60-79%", color: "bg-blue-500", count: filteredEvaluations.filter(e => e.overallScore >= 60 && e.overallScore < 80).length }, { range: "40-59%", color: "bg-yellow-500", count: filteredEvaluations.filter(e => e.overallScore >= 40 && e.overallScore < 60).length }, { range: "0-39%", color: "bg-red-500", count: filteredEvaluations.filter(e => e.overallScore < 40).length } ].map(item => (
{item.count}

{item.range}

{filteredEvaluations.length > 0 ? Math.round((item.count / filteredEvaluations.length) * 100) : 0}%

))}
{/* Additional Insights */} {evaluations.length > 0 && (
Most Common Modalities Frequently evaluated modality combinations
{Array.from(new Set(evaluations.flatMap(e => e.modality))) .map(modality => ({ modality, count: evaluations.filter(e => e.modality.includes(modality)).length })) .sort((a, b) => b.count - a.count) .slice(0, 5) .map(item => (
{item.modality} {item.count} evaluation{item.count !== 1 ? 's' : ''}
))}
Organizations Number of evaluations per organization
{ORGANIZATIONS .map(org => ({ organization: org, count: evaluations.filter(e => e.organization === org).length })) .sort((a, b) => b.count - a.count) .map(item => (
{item.organization} {item.count}
))}
Evaluation Timeline Recent evaluation activity
{evaluations .sort((a, b) => new Date(b.submittedDate).getTime() - new Date(a.submittedDate).getTime()) .slice(0, 5) .map(evaluation => (
{evaluation.name} {new Date(evaluation.submittedDate).toLocaleDateString()}
))}
)}
) }