"use client" import { useState, useEffect } from "react" import { Dialog, DialogContent, DialogHeader, DialogTitle } from "@/components/ui/dialog" import { Button } from "@/components/ui/button" import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from "@/components/ui/select" import { ArrowLeft, Loader2 } from "lucide-react" import { LineChart, Line, XAxis, YAxis, CartesianGrid, Tooltip, ResponsiveContainer, Legend } from "recharts" interface MetricsDialogProps { open: boolean onClose: () => void vmid: number vmName: string vmType: "qemu" | "lxc" metricType: "cpu" | "memory" | "network" | "disk" } const TIMEFRAME_OPTIONS = [ { value: "hour", label: "1 Hora" }, { value: "day", label: "24 Horas" }, { value: "week", label: "7 Días" }, { value: "month", label: "30 Días" }, { value: "year", label: "1 Año" }, ] const METRIC_TITLES = { cpu: "Uso de CPU", memory: "Uso de Memoria", network: "Tráfico de Red", disk: "I/O de Disco", } export function MetricsDialog({ open, onClose, vmid, vmName, vmType, metricType }: MetricsDialogProps) { const [timeframe, setTimeframe] = useState("week") const [data, setData] = useState([]) const [loading, setLoading] = useState(false) const [error, setError] = useState(null) useEffect(() => { if (open) { fetchMetrics() } }, [open, vmid, timeframe]) const fetchMetrics = async () => { setLoading(true) setError(null) try { const response = await fetch(`http://localhost:8008/api/vms/${vmid}/metrics?timeframe=${timeframe}`) if (!response.ok) { throw new Error("Failed to fetch metrics") } const result = await response.json() // Transform data for charts const transformedData = result.data.map((item: any) => ({ time: new Date(item.time * 1000).toLocaleString("es-ES", { month: "short", day: "numeric", hour: timeframe === "hour" ? "2-digit" : undefined, minute: timeframe === "hour" ? "2-digit" : undefined, }), timestamp: item.time, cpu: item.cpu ? (item.cpu * 100).toFixed(2) : 0, memory: item.mem ? ((item.mem / item.maxmem) * 100).toFixed(2) : 0, memoryMB: item.mem ? (item.mem / 1024 / 1024).toFixed(0) : 0, maxMemoryMB: item.maxmem ? (item.maxmem / 1024 / 1024).toFixed(0) : 0, netin: item.netin ? (item.netin / 1024 / 1024).toFixed(2) : 0, netout: item.netout ? (item.netout / 1024 / 1024).toFixed(2) : 0, diskread: item.diskread ? (item.diskread / 1024 / 1024).toFixed(2) : 0, diskwrite: item.diskwrite ? (item.diskwrite / 1024 / 1024).toFixed(2) : 0, })) setData(transformedData) } catch (err) { console.error("[v0] Error fetching metrics:", err) setError("Error al cargar las métricas") } finally { setLoading(false) } } const renderChart = () => { if (loading) { return (
) } if (error) { return (

{error}

) } if (data.length === 0) { return (

No hay datos disponibles

) } switch (metricType) { case "cpu": return ( ) case "memory": return ( ) case "network": return ( ) case "disk": return ( ) } } return ( {/* Fixed Header */}
{METRIC_TITLES[metricType]} - {vmName}

VMID: {vmid} • Tipo: {vmType.toUpperCase()}

{/* Scrollable Content */}
{renderChart()}
) }