import React, { useState } from 'react'; import { ChevronLeft, ChevronRight, Upload, MapPin, Store, Factory, Check } from 'lucide-react'; import toast from 'react-hot-toast'; interface OnboardingPageProps { user: any; onComplete: () => void; } interface BakeryData { name: string; address: string; businessType: 'individual' | 'central_workshop'; coordinates?: { lat: number; lng: number }; products: string[]; hasHistoricalData: boolean; csvFile?: File; } const MADRID_PRODUCTS = [ 'Croissants', 'Pan de molde', 'Baguettes', 'Panecillos', 'Ensaimadas', 'Napolitanas', 'Magdalenas', 'Donuts', 'Palmeras', 'Café', 'Chocolate caliente', 'Zumos', 'Bocadillos', 'Empanadas', 'Tartas' ]; const OnboardingPage: React.FC = ({ user, onComplete }) => { const [currentStep, setCurrentStep] = useState(1); const [isLoading, setIsLoading] = useState(false); const [bakeryData, setBakeryData] = useState({ name: '', address: '', businessType: 'individual', products: [], hasHistoricalData: false }); const steps = [ { id: 1, title: 'Datos de Panadería', icon: Store }, { id: 2, title: 'Productos y Servicios', icon: Factory }, { id: 3, title: 'Datos Históricos', icon: Upload }, { id: 4, title: 'Configuración Final', icon: Check } ]; const handleNext = () => { if (validateCurrentStep()) { setCurrentStep(prev => Math.min(prev + 1, steps.length)); } }; const handlePrevious = () => { setCurrentStep(prev => Math.max(prev - 1, 1)); }; const validateCurrentStep = (): boolean => { switch (currentStep) { case 1: if (!bakeryData.name.trim()) { toast.error('El nombre de la panadería es obligatorio'); return false; } if (!bakeryData.address.trim()) { toast.error('La dirección es obligatoria'); return false; } return true; case 2: if (bakeryData.products.length === 0) { toast.error('Selecciona al menos un producto'); return false; } return true; case 3: if (bakeryData.hasHistoricalData && !bakeryData.csvFile) { toast.error('Por favor, sube tu archivo CSV con datos históricos'); return false; } return true; default: return true; } }; const handleComplete = async () => { setIsLoading(true); try { // Step 1: Register tenant/bakery const tenantResponse = await fetch('/api/v1/tenants/register', { method: 'POST', headers: { 'Content-Type': 'application/json', 'Authorization': `Bearer ${localStorage.getItem('auth_token')}` }, body: JSON.stringify({ name: bakeryData.name, address: bakeryData.address, business_type: bakeryData.businessType, coordinates: bakeryData.coordinates, products: bakeryData.products }) }); if (!tenantResponse.ok) { throw new Error('Error al registrar la panadería'); } const tenantData = await tenantResponse.json(); const tenantId = tenantData.tenant.id; // Step 2: Upload CSV data if provided if (bakeryData.hasHistoricalData && bakeryData.csvFile) { const formData = new FormData(); formData.append('file', bakeryData.csvFile); const uploadResponse = await fetch(`/api/v1/tenants/${tenantId}/data/upload`, { method: 'POST', headers: { 'Authorization': `Bearer ${localStorage.getItem('auth_token')}` }, body: formData }); if (!uploadResponse.ok) { throw new Error('Error al subir los datos históricos'); } // Step 3: Start training process const trainingResponse = await fetch(`/api/v1/tenants/${tenantId}/training/start`, { method: 'POST', headers: { 'Content-Type': 'application/json', 'Authorization': `Bearer ${localStorage.getItem('auth_token')}` }, body: JSON.stringify({ products: bakeryData.products }) }); if (!trainingResponse.ok) { throw new Error('Error al iniciar el entrenamiento del modelo'); } toast.success('¡Datos subidos! El entrenamiento del modelo comenzará pronto.'); } toast.success('¡Configuración completada! Bienvenido a PanIA'); onComplete(); } catch (error: any) { console.error('Onboarding completion error:', error); toast.error(error.message || 'Error al completar la configuración'); } finally { setIsLoading(false); } }; const renderStep = () => { switch (currentStep) { case 1: return (

Información de tu Panadería

setBakeryData(prev => ({ ...prev, name: e.target.value }))} className="w-full px-4 py-3 border border-gray-300 rounded-xl focus:ring-2 focus:ring-primary-500 focus:border-primary-500" placeholder="Ej: Panadería San Miguel" />
setBakeryData(prev => ({ ...prev, address: e.target.value }))} className="w-full pl-10 pr-4 py-3 border border-gray-300 rounded-xl focus:ring-2 focus:ring-primary-500 focus:border-primary-500" placeholder="Calle Mayor, 123, Madrid" />
); case 2: return (

¿Qué productos vendes?

Selecciona los productos más comunes en tu panadería

{MADRID_PRODUCTS.map((product) => ( ))}

Productos seleccionados: {bakeryData.products.length}

); case 3: return (

Datos Históricos de Ventas

Para obtener mejores predicciones, puedes subir tus datos históricos de ventas

{bakeryData.hasHistoricalData && (
{bakeryData.csvFile ? (

Archivo seleccionado:

{bakeryData.csvFile.name}

) : (

Sube tu archivo CSV con las ventas históricas

{ const file = e.target.files?.[0]; if (file) { setBakeryData(prev => ({ ...prev, csvFile: file })); } }} className="hidden" id="csv-upload" />
)}

Formato esperado del CSV:

Fecha, Producto, Cantidad

2024-01-01, Croissants, 45

2024-01-01, Pan de molde, 12

)} {!bakeryData.hasHistoricalData && (

No te preocupes, PanIA puede empezar a funcionar sin datos históricos. Las predicciones mejorarán automáticamente conforme uses el sistema.

)}
); case 4: return (

¡Todo listo para comenzar!

Revisa los datos de tu panadería antes de continuar

Panadería:

{bakeryData.name}

Dirección:

{bakeryData.address}

Tipo de negocio:

{bakeryData.businessType === 'individual' ? 'Panadería Individual' : 'Obrador Central'}

Productos:

{bakeryData.products.join(', ')}

Datos históricos:

{bakeryData.hasHistoricalData ? `Sí (${bakeryData.csvFile?.name})` : 'No'}

); default: return null; } }; return (
{/* Header */}
🥖

Configuración inicial

Vamos a configurar PanIA para tu panadería

{/* Progress Steps */}
{steps.map((step) => (
= step.id ? 'bg-primary-500 border-primary-500 text-white' : 'border-gray-300 text-gray-500' }`} >
{step.title}
))}
{/* Step Content */}
{renderStep()}
{/* Navigation */}
{currentStep < steps.length ? ( ) : ( )}
); }; export default OnboardingPage;