import React, { useState, useCallback } from 'react'; import { motion, AnimatePresence } from 'framer-motion'; import { UploadCloud, File, Sheet, Loader2, CheckCircle, Sparkles, Wand2, BarChart3, X, AlertCircle } from 'lucide-react'; import { generateSyntheticCsv } from '../utils/syntheticDataGenerator'; import { TierKey } from '../types'; import toast, { Toaster } from 'react-hot-toast'; import clsx from 'clsx'; interface DataUploaderEnhancedProps { selectedTier: TierKey; onAnalysisReady: () => void; isAnalyzing: boolean; } type UploadStatus = 'idle' | 'generating' | 'uploading' | 'success'; const formatFileSize = (bytes: number, decimals = 2) => { if (bytes === 0) return '0 Bytes'; const k = 1024; const dm = decimals < 0 ? 0 : decimals; const sizes = ['Bytes', 'KB', 'MB', 'GB', 'TB']; const i = Math.floor(Math.log(bytes) / Math.log(k)); return parseFloat((bytes / Math.pow(k, i)).toFixed(dm)) + ' ' + sizes[i]; }; const DataUploaderEnhanced: React.FC = ({ selectedTier, onAnalysisReady, isAnalyzing }) => { const [file, setFile] = useState(null); const [sheetUrl, setSheetUrl] = useState(''); const [status, setStatus] = useState('idle'); const [isDragging, setIsDragging] = useState(false); const isActionInProgress = status === 'generating' || status === 'uploading' || isAnalyzing; const resetState = (clearAll: boolean = true) => { setStatus('idle'); if (clearAll) { setFile(null); setSheetUrl(''); } }; const handleDataReady = (message: string) => { setStatus('success'); toast.success(message, { icon: '✅', duration: 3000, }); }; const handleFileChange = (selectedFile: File | null) => { resetState(); if (selectedFile) { const allowedTypes = [ 'text/csv', 'application/vnd.ms-excel', 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', ]; if (allowedTypes.includes(selectedFile.type) || selectedFile.name.endsWith('.csv') || selectedFile.name.endsWith('.xlsx') || selectedFile.name.endsWith('.xls')) { setFile(selectedFile); setSheetUrl(''); toast.success(`Archivo "${selectedFile.name}" cargado correctamente`, { icon: '📄', }); } else { toast.error('Tipo de archivo no válido. Sube un CSV o Excel.', { icon: '❌', }); setFile(null); } } }; const onDragOver = useCallback((e: React.DragEvent) => { e.preventDefault(); e.stopPropagation(); if (!isActionInProgress) setIsDragging(true); }, [isActionInProgress]); const onDragLeave = useCallback((e: React.DragEvent) => { e.preventDefault(); e.stopPropagation(); setIsDragging(false); }, []); const onDrop = useCallback((e: React.DragEvent) => { e.preventDefault(); e.stopPropagation(); setIsDragging(false); if (isActionInProgress) return; const droppedFile = e.dataTransfer.files && e.dataTransfer.files[0]; handleFileChange(droppedFile); }, [isActionInProgress]); const handleGenerateSyntheticData = () => { resetState(); setStatus('generating'); toast.loading('Generando datos sintéticos...', { id: 'generating' }); setTimeout(() => { const csvData = generateSyntheticCsv(selectedTier); toast.dismiss('generating'); handleDataReady('¡Datos Sintéticos Generados!'); }, 2000); }; const handleSubmit = () => { if (!file && !sheetUrl) { toast.error('Por favor, sube un archivo o introduce una URL de Google Sheet.', { icon: '⚠️', }); return; } resetState(false); setStatus('uploading'); toast.loading('Procesando datos...', { id: 'uploading' }); setTimeout(() => { toast.dismiss('uploading'); handleDataReady('¡Datos Recibidos!'); }, 2000); }; const renderMainButton = () => { if (status === 'success') { return ( {isAnalyzing ? ( <> Analizando... ) : ( <> Ver Dashboard de Diagnóstico )} ); } return ( {status === 'uploading' ? ( <> Procesando... ) : ( <> Generar Análisis )} ); }; return ( <>
Paso 2 Sube tus Datos y Ejecuta el Análisis Usa una de las siguientes opciones para enviarnos tus datos para el análisis.
{/* Drag & Drop Area */} handleFileChange(e.target.files ? e.target.files[0] : null)} disabled={isActionInProgress} /> {/* File Preview */} {status !== 'uploading' && status !== 'success' && file && (
{file.name} {formatFileSize(file.size)}
{ setFile(null); toast('Archivo eliminado', { icon: '🗑️' }); }} className="w-8 h-8 flex items-center justify-center rounded-lg bg-red-100 hover:bg-red-200 text-red-600 transition-colors flex-shrink-0" >
)}
{/* Uploading Progress */} {status === 'uploading' && file && (
{file.name} {formatFileSize(file.size)}
)}

O
{/* Generate Synthetic Data - DESTACADO */}

🎭 Prueba con Datos de Demo

Explora el diagnóstico sin necesidad de datos reales. Generamos un dataset completo para ti.

{status === 'generating' ? ( <> Generando... ) : ( <> Generar Datos Sintéticos )}

O
{/* Google Sheets URL */} { resetState(); setSheetUrl(e.target.value); setFile(null); }} disabled={isActionInProgress} className="w-full pl-12 pr-4 py-4 border-2 border-slate-300 rounded-xl focus:ring-2 focus:ring-blue-500 focus:border-blue-500 transition disabled:bg-slate-100 text-sm" /> {/* Google Sheets Preview */} {status !== 'uploading' && status !== 'success' && sheetUrl && !file && (
{sheetUrl}
{ setSheetUrl(''); toast('URL eliminada', { icon: '🗑️' }); }} className="w-8 h-8 flex items-center justify-center rounded-lg bg-red-100 hover:bg-red-200 text-red-600 transition-colors flex-shrink-0" >
)}
{/* Success Message */} {status === 'success' && ( ¡Listo para analizar! )} {/* Main Action Button */} {renderMainButton()}
); }; export default DataUploaderEnhanced;