import React, { useState } from 'react'; import { Calendar, TrendingUp, AlertTriangle, BarChart3, Download, Settings } from 'lucide-react'; import { Button, Card, Badge, Select } from '../../../../components/ui'; import { PageHeader } from '../../../../components/layout'; import { DemandChart, ForecastTable, SeasonalityIndicator, AlertsPanel } from '../../../../components/domain/forecasting'; const ForecastingPage: React.FC = () => { const [selectedProduct, setSelectedProduct] = useState('all'); const [forecastPeriod, setForecastPeriod] = useState('7'); const [viewMode, setViewMode] = useState<'chart' | 'table'>('chart'); const forecastData = { accuracy: 92, totalDemand: 1247, growthTrend: 8.5, seasonalityFactor: 1.15, }; const products = [ { id: 'all', name: 'Todos los productos' }, { id: 'bread', name: 'Panes' }, { id: 'pastry', name: 'Bollería' }, { id: 'cake', name: 'Tartas' }, ]; const periods = [ { value: '7', label: '7 días' }, { value: '14', label: '14 días' }, { value: '30', label: '30 días' }, { value: '90', label: '3 meses' }, ]; const mockForecasts = [ { id: '1', product: 'Pan de Molde Integral', currentStock: 25, forecastDemand: 45, recommendedProduction: 50, confidence: 95, trend: 'up', stockoutRisk: 'low', }, { id: '2', product: 'Croissants de Mantequilla', currentStock: 18, forecastDemand: 32, recommendedProduction: 35, confidence: 88, trend: 'stable', stockoutRisk: 'medium', }, { id: '3', product: 'Baguettes Francesas', currentStock: 12, forecastDemand: 28, recommendedProduction: 30, confidence: 91, trend: 'down', stockoutRisk: 'high', }, ]; const alerts = [ { id: '1', type: 'stockout', product: 'Baguettes Francesas', message: 'Alto riesgo de agotamiento en las próximas 24h', severity: 'high', recommendation: 'Incrementar producción en 15 unidades', }, { id: '2', type: 'overstock', product: 'Magdalenas', message: 'Probable exceso de stock para mañana', severity: 'medium', recommendation: 'Reducir producción en 20%', }, { id: '3', type: 'weather', product: 'Todos', message: 'Lluvia prevista - incremento esperado en demanda de bollería', severity: 'info', recommendation: 'Aumentar producción de productos de interior en 10%', }, ]; const weatherImpact = { today: 'sunny', temperature: 22, demandFactor: 0.95, affectedCategories: ['helados', 'bebidas frías'], }; const seasonalInsights = [ { period: 'Mañana', factor: 1.2, products: ['Pan', 'Bollería'] }, { period: 'Tarde', factor: 0.8, products: ['Tartas', 'Dulces'] }, { period: 'Fin de semana', factor: 1.4, products: ['Tartas especiales'] }, ]; const getTrendIcon = (trend: string) => { switch (trend) { case 'up': return ; case 'down': return ; default: return
; } }; const getRiskBadge = (risk: string) => { const riskConfig = { low: { color: 'green', text: 'Bajo' }, medium: { color: 'yellow', text: 'Medio' }, high: { color: 'red', text: 'Alto' }, }; const config = riskConfig[risk as keyof typeof riskConfig]; return {config?.text}; }; return (
} /> {/* Key Metrics */}

Precisión del Modelo

{forecastData.accuracy}%

Demanda Prevista

{forecastData.totalDemand}

próximos {forecastPeriod} días

Tendencia

+{forecastData.growthTrend}%

vs período anterior

Factor Estacional

{forecastData.seasonalityFactor}x

multiplicador actual

{/* Controls */}
{/* Main Forecast Display */}
{viewMode === 'chart' ? ( ) : ( )}
{/* Alerts Panel */}
{/* Weather Impact */}

Impacto Meteorológico

Hoy:
{weatherImpact.temperature}°C
Factor de demanda: {weatherImpact.demandFactor}x

Categorías afectadas:

{weatherImpact.affectedCategories.map((category, index) => ( {category} ))}
{/* Seasonal Insights */}

Patrones Estacionales

{seasonalInsights.map((insight, index) => (
{insight.period} {insight.factor}x
{insight.products.map((product, idx) => ( {product} ))}
))}
{/* Detailed Forecasts Table */}

Predicciones Detalladas

{mockForecasts.map((forecast) => ( ))}
Producto Stock Actual Demanda Prevista Producción Recomendada Confianza Tendencia Riesgo Agotamiento
{forecast.product}
{forecast.currentStock} {forecast.forecastDemand} {forecast.recommendedProduction} {forecast.confidence}%
{getTrendIcon(forecast.trend)}
{getRiskBadge(forecast.stockoutRisk)}
); }; export default ForecastingPage;