import React, { useState, useEffect } from 'react'; import { Brain, Cpu, Database, TrendingUp, CheckCircle, AlertCircle, Clock, Zap, Target, BarChart3, Loader } from 'lucide-react'; interface TrainingProgressProps { progress: { progress: number; status: string; currentStep: string; productsCompleted: number; productsTotal: number; estimatedTimeRemaining: number; error?: string; }; onTimeout?: () => void; } // Map backend steps to user-friendly information const STEP_INFO_MAP = { 'data_validation': { title: 'Validando tus datos', description: 'Verificamos la calidad y completitud de tu información histórica', tip: '💡 Datos más completos = predicciones más precisas', icon: Database, color: 'blue' }, 'feature_engineering': { title: 'Creando características predictivas', description: 'Identificamos patrones estacionales y tendencias en tus ventas', tip: '💡 Tu modelo detectará automáticamente picos de demanda', icon: TrendingUp, color: 'indigo' }, 'model_training': { title: 'Entrenando modelo de IA', description: 'Creamos tu modelo personalizado usando algoritmos avanzados', tip: '💡 Este proceso optimiza las predicciones para tu negocio específico', icon: Brain, color: 'purple' }, 'model_validation': { title: 'Validando precisión', description: 'Verificamos que el modelo genere predicciones confiables', tip: '💡 Garantizamos que las predicciones sean útiles para tu toma de decisiones', icon: Target, color: 'green' }, // Fallback for unknown steps 'default': { title: 'Procesando...', description: 'Procesando tus datos para crear el modelo de predicción', tip: '💡 Cada paso nos acerca a predicciones más precisas', icon: Cpu, color: 'gray' } }; const EXPECTED_BENEFITS = [ { icon: BarChart3, title: 'Predicciones Precisas', description: 'Conoce exactamente cuánto vender cada día' }, { icon: Zap, title: 'Optimización Automática', description: 'Reduce desperdicios y maximiza ganancias' }, { icon: TrendingUp, title: 'Detección de Tendencias', description: 'Identifica patrones estacionales y eventos especiales' } ]; export default function EnhancedTrainingProgress({ progress, onTimeout }: TrainingProgressProps) { const [showTimeoutWarning, setShowTimeoutWarning] = useState(false); const [startTime] = useState(Date.now()); // Auto-show timeout warning after 8 minutes (480,000ms) useEffect(() => { const timeoutTimer = setTimeout(() => { if (progress.status === 'running' && progress.progress < 100) { setShowTimeoutWarning(true); } }, 480000); // 8 minutes return () => clearTimeout(timeoutTimer); }, [progress.status, progress.progress]); const getCurrentStepInfo = () => { // Try to match the current step from backend const stepKey = progress.currentStep?.toLowerCase().replace(/\s+/g, '_'); return STEP_INFO_MAP[stepKey] || STEP_INFO_MAP['default']; }; const formatTime = (seconds: number): string => { if (!seconds || seconds <= 0) return '0m 0s'; const minutes = Math.floor(seconds / 60); const remainingSeconds = seconds % 60; return `${minutes}m ${remainingSeconds}s`; }; const getProgressSteps = () => { // Create progress steps based on current progress percentage const steps = [ { id: 'data_validation', threshold: 25, name: 'Validación' }, { id: 'feature_engineering', threshold: 50, name: 'Características' }, { id: 'model_training', threshold: 80, name: 'Entrenamiento' }, { id: 'model_validation', threshold: 100, name: 'Validación' } ]; return steps.map(step => ({ ...step, completed: progress.progress >= step.threshold, current: progress.progress >= (step.threshold - 25) && progress.progress < step.threshold })); }; const handleContinueToDashboard = () => { setShowTimeoutWarning(false); if (onTimeout) { onTimeout(); } }; const handleKeepWaiting = () => { setShowTimeoutWarning(false); }; const currentStepInfo = getCurrentStepInfo(); const progressSteps = getProgressSteps(); // Handle error state if (progress.status === 'failed' || progress.error) { return (

Error en el Entrenamiento

Ha ocurrido un problema durante el entrenamiento. Nuestro equipo ha sido notificado.

Detalles del Error

{progress.error || 'Error desconocido durante el entrenamiento'}

• Puedes intentar el entrenamiento nuevamente

• Verifica que tus datos históricos estén completos

• Contacta soporte si el problema persiste

); } return (
{/* Header */}

🧠 Entrenando tu modelo de predicción

Estamos procesando tus datos históricos para crear predicciones personalizadas

{/* Main Progress Section */}
{/* Overall Progress Bar */}
Progreso General {progress.progress}%
{/* Current Step Info */}

{currentStepInfo.title}

{currentStepInfo.description}

{currentStepInfo.tip}

{/* Step Progress Indicators */}
{progressSteps.map((step, index) => (
{step.completed ? ( ) : step.current ? (
) : (
)} {step.name}
))}
{/* Enhanced Stats Grid */}
Productos Procesados
{progress.productsCompleted}/{progress.productsTotal || 'N/A'}
{progress.productsTotal > 0 && (
)}
Tiempo Restante
{progress.estimatedTimeRemaining ? formatTime(progress.estimatedTimeRemaining * 60) // Convert minutes to seconds : 'Calculando...' }
Precisión Esperada
~85%
{/* Status Indicator */}
Estado: {progress.status === 'running' ? 'Entrenando' : progress.status} Paso actual: {progress.currentStep || 'Procesando...'}
{/* Expected Benefits - Only show if progress < 80% to keep user engaged */} {progress.progress < 80 && (

Lo que podrás hacer una vez completado

{EXPECTED_BENEFITS.map((benefit, index) => (

{benefit.title}

{benefit.description}

))}
)} {/* Timeout Warning Modal */} {showTimeoutWarning && (

Entrenamiento tomando más tiempo

Puedes explorar el dashboard mientras terminamos el entrenamiento. Te notificaremos cuando esté listo.

)}
); }