import { useState } from 'react'; import { BarChart3, TrendingUp, TrendingDown, Award, Target, Eye, EyeOff } from 'lucide-react'; interface BenchmarkMetric { id: string; name: string; yourValue: number; industryAverage: number; topPerformers: number; unit: string; description: string; category: 'efficiency' | 'revenue' | 'waste' | 'customer' | 'quality'; trend: 'improving' | 'declining' | 'stable'; percentile: number; // Your position (0-100) insights: string[]; } interface CompetitiveBenchmarksProps { metrics?: BenchmarkMetric[]; location?: string; // e.g., "Madrid Centro" showSensitiveData?: boolean; className?: string; } const CompetitiveBenchmarks: React.FC = ({ metrics: propMetrics, location = "Madrid Centro", showSensitiveData = true, className = '' }) => { const [selectedCategory, setSelectedCategory] = useState('all'); const [showDetails, setShowDetails] = useState(showSensitiveData); // Sample benchmark data (anonymized) const defaultMetrics: BenchmarkMetric[] = [ { id: 'forecast_accuracy', name: 'Precisión de Predicciones', yourValue: 87.2, industryAverage: 72.5, topPerformers: 94.1, unit: '%', description: 'Qué tan precisas son las predicciones vs. ventas reales', category: 'quality', trend: 'improving', percentile: 85, insights: [ 'Superioridad del 15% vs. promedio de la industria', 'Solo 7 puntos por debajo de los mejores del sector', 'Mejora consistente en los últimos 3 meses' ] }, { id: 'waste_percentage', name: 'Porcentaje de Desperdicio', yourValue: 8.3, industryAverage: 12.7, topPerformers: 4.2, unit: '%', description: 'Productos no vendidos como % del total producido', category: 'waste', trend: 'improving', percentile: 78, insights: [ '35% menos desperdicio que el promedio', 'Oportunidad: reducir 4 puntos más para llegar al top', 'Ahorro de ~€230/mes vs. promedio de la industria' ] }, { id: 'revenue_per_sqm', name: 'Ingresos por m²', yourValue: 2847, industryAverage: 2134, topPerformers: 4521, unit: '€/mes', description: 'Ingresos mensuales por metro cuadrado de local', category: 'revenue', trend: 'stable', percentile: 73, insights: [ '33% más eficiente en generación de ingresos', 'Potencial de crecimiento: +59% para alcanzar el top', 'Excelente aprovechamiento del espacio' ] }, { id: 'customer_retention', name: 'Retención de Clientes', yourValue: 68, industryAverage: 61, topPerformers: 84, unit: '%', description: 'Clientes que regresan al menos una vez por semana', category: 'customer', trend: 'improving', percentile: 67, insights: [ '11% mejor retención que la competencia', 'Oportunidad: programas de fidelización podrían sumar 16 puntos', 'Base de clientes sólida y leal' ] }, { id: 'production_efficiency', name: 'Eficiencia de Producción', yourValue: 1.8, industryAverage: 2.3, topPerformers: 1.2, unit: 'h/100 unidades', description: 'Tiempo promedio para producir 100 unidades', category: 'efficiency', trend: 'improving', percentile: 71, insights: [ '22% más rápido que el promedio', 'Excelente optimización de procesos', 'Margen para mejora: -33% para ser top performer' ] }, { id: 'profit_margin', name: 'Margen de Ganancia', yourValue: 32.5, industryAverage: 28.1, topPerformers: 41.7, unit: '%', description: 'Ganancia neta como % de los ingresos totales', category: 'revenue', trend: 'stable', percentile: 69, insights: [ '16% más rentable que la competencia', 'Sólida gestión de costos', 'Oportunidad: optimizar ingredientes premium' ] } ]; const metrics = propMetrics || defaultMetrics; const categories = [ { id: 'all', name: 'Todas', count: metrics.length }, { id: 'revenue', name: 'Ingresos', count: metrics.filter(m => m.category === 'revenue').length }, { id: 'efficiency', name: 'Eficiencia', count: metrics.filter(m => m.category === 'efficiency').length }, { id: 'waste', name: 'Desperdicio', count: metrics.filter(m => m.category === 'waste').length }, { id: 'customer', name: 'Clientes', count: metrics.filter(m => m.category === 'customer').length }, { id: 'quality', name: 'Calidad', count: metrics.filter(m => m.category === 'quality').length } ]; const filteredMetrics = metrics.filter(metric => selectedCategory === 'all' || metric.category === selectedCategory ); const getPerformanceLevel = (percentile: number) => { if (percentile >= 90) return { label: 'Excelente', color: 'text-green-600', bg: 'bg-green-50' }; if (percentile >= 75) return { label: 'Bueno', color: 'text-blue-600', bg: 'bg-blue-50' }; if (percentile >= 50) return { label: 'Promedio', color: 'text-yellow-600', bg: 'bg-yellow-50' }; return { label: 'Mejora Necesaria', color: 'text-red-600', bg: 'bg-red-50' }; }; const getTrendIcon = (trend: string) => { switch (trend) { case 'improving': return ; case 'declining': return ; default: return
; } }; const getComparisonPercentage = (yourValue: number, compareValue: number, isLowerBetter = false) => { const diff = isLowerBetter ? ((compareValue - yourValue) / compareValue) * 100 : ((yourValue - compareValue) / compareValue) * 100; return { value: Math.abs(diff), isPositive: diff > 0 }; }; const isLowerBetter = (metricId: string) => { return ['waste_percentage', 'production_efficiency'].includes(metricId); }; const averagePercentile = Math.round(metrics.reduce((sum, m) => sum + m.percentile, 0) / metrics.length); return (
{/* Header */}

Benchmarks Competitivos

Comparación anónima con panaderías similares en {location}

{/* Overall Score */}
{averagePercentile}
Percentil General
{/* Toggle Details */}
{/* Performance Summary */}
{metrics.filter(m => m.percentile >= 75).length}
Métricas Top 25%
{metrics.filter(m => m.trend === 'improving').length}
En Mejora
{metrics.filter(m => m.percentile < 50).length}
Áreas de Oportunidad
{/* Category Filters */}
{categories.map(category => ( ))}
{/* Metrics List */}
{filteredMetrics.map(metric => { const performance = getPerformanceLevel(metric.percentile); const vsAverage = getComparisonPercentage( metric.yourValue, metric.industryAverage, isLowerBetter(metric.id) ); const vsTop = getComparisonPercentage( metric.yourValue, metric.topPerformers, isLowerBetter(metric.id) ); return (

{metric.name}

{getTrendIcon(metric.trend)} {performance.label}

{metric.description}

{metric.yourValue.toLocaleString('es-ES')}{metric.unit}
Tu Resultado
{/* Comparison Bars */}
{/* Your Performance */}
Tu Rendimiento Percentil {metric.percentile}
{/* Industry Average */}
Promedio Industria {metric.industryAverage.toLocaleString('es-ES')}{metric.unit} ({vsAverage.isPositive ? '+' : '-'}{vsAverage.value.toFixed(1)}%)
{/* Top Performers */}
Top Performers {metric.topPerformers.toLocaleString('es-ES')}{metric.unit} ({vsTop.isPositive ? '+' : '-'}{vsTop.value.toFixed(1)}%)
{/* Insights */} {showDetails && (
Insights Clave:
    {metric.insights.map((insight, index) => (
  • {insight}
  • ))}
)}
); })}
{filteredMetrics.length === 0 && (

No hay métricas disponibles

Los benchmarks aparecerán cuando haya suficientes datos

)} {/* Disclaimer */}
🔒 Privacidad: Todos los datos están anonimizados. Solo se comparten métricas agregadas de panaderías similares en tamaño y ubicación.
); }; export default CompetitiveBenchmarks;