"use client" import { useState } from "react" import { useRouter } from "next/navigation" import { format, parseISO } from "date-fns" import { Calendar, ChevronRight, Filter, Search } from "lucide-react" import { Button } from "@/components/ui/button" import { Card, CardContent, CardDescription, CardFooter, CardHeader, CardTitle } from "@/components/ui/card" import { Input } from "@/components/ui/input" import { Skeleton } from "@/components/ui/skeleton" import { useSimulation } from "./simulation-provider" import { Badge } from "@/components/ui/badge" import { Popover, PopoverContent, PopoverTrigger } from "@/components/ui/popover" import { Calendar as CalendarComponent } from "@/components/ui/calendar" import { Label } from "@/components/ui/label" import { Checkbox } from "@/components/ui/checkbox" export function SimulationList() { const router = useRouter() const { simulations, loading, error } = useSimulation() const [searchTerm, setSearchTerm] = useState("") const [dateRange, setDateRange] = useState<{ from: Date | undefined; to: Date | undefined }>({ from: undefined, to: undefined, }) const [showFilters, setShowFilters] = useState(false) const [successFilter, setSuccessFilter] = useState(null) const handleSimulationSelect = (id: string) => { router.push(`/simulations/${id}`) } // Función auxiliar para formatear fechas de manera segura const formatDate = (dateString: string) => { try { // Corregir formato incorrecto con :00Z al final if (dateString.includes('T') && dateString.endsWith(':00Z')) { dateString = dateString.replace(':00Z', 'Z'); } // Intenta parsear la fecha desde ISO const date = parseISO(dateString); return format(date, "PPP"); } catch (error) { console.error("Error formatting date:", dateString, error); // Si falla, intenta otro enfoque: crear una fecha a partir del ID de simulación try { if (dateString.includes("_")) { // Si la fecha es parte del ID (como en "2025-02-11_00-11-23_825") const parts = dateString.split("_"); if (parts.length >= 2) { const datePart = parts[0]; const timePart = parts[1].replace(/-/g, ":"); return `${datePart} ${timePart}`; } } // Si todo lo anterior falla, intentar crear una fecha simple return new Date(dateString).toLocaleDateString(); } catch (e) { // Si todo falla, devuelve un marcador de posición return "Date unavailable"; } } }; const filteredSimulations = simulations.filter((sim) => { // Search filter if (searchTerm && !sim.id.toLowerCase().includes(searchTerm.toLowerCase())) { return false } // Date filter if (dateRange.from) { try { const simDate = new Date(sim.date); if (simDate < dateRange.from) return false; } catch (e) { // Si la fecha no se puede parsear, mantenemos el elemento console.warn("Could not parse date for filtering:", sim.date); } } if (dateRange.to) { try { const simDate = new Date(sim.date); if (simDate > dateRange.to) return false; } catch (e) { // Si la fecha no se puede parsear, mantenemos el elemento console.warn("Could not parse date for filtering:", sim.date); } } // Success rate filter if (successFilter === "high" && sim.successRate < 75) { return false } if (successFilter === "medium" && (sim.successRate < 50 || sim.successRate >= 75)) { return false } if (successFilter === "low" && sim.successRate >= 50) { return false } return true }) if (error) { return (

Error

{error}

) } return (

Simulation Runs

setSearchTerm(e.target.value)} />

Filters

Filter simulation results by date and success rate

setSuccessFilter(successFilter === "high" ? null : "high")} />
setSuccessFilter(successFilter === "medium" ? null : "medium")} />
setSuccessFilter(successFilter === "low" ? null : "low")} />
{loading ? (
{[1, 2, 3, 4, 5, 6].map((i) => (
))}
) : filteredSimulations.length === 0 ? (

No simulations found

{searchTerm || dateRange.from || dateRange.to || successFilter ? "Try adjusting your filters to see more results." : "No simulation runs are available. Run a simulation to get started."}

) : (
{filteredSimulations.map((simulation) => (
{formatDate(simulation.date || simulation.id)}
{simulation.id}
Nodes:
{simulation.parameters.numberNodes.min}-{simulation.parameters.numberNodes.max}
Failure Rate:
{simulation.parameters.failureRate.min}%-{simulation.parameters.failureRate.max}%
Success Rate:
= 75 ? "bg-green-500" : simulation.successRate >= 50 ? "bg-yellow-500" : "bg-red-500" } > {simulation.successRate}%
))}
)}
) }