import React, { useMemo } from 'react'; import { motion } from 'framer-motion'; import { RoadmapInitiative, RoadmapPhase } from '../types'; import { Bot, UserCheck, Cpu, Calendar, DollarSign, Users, TrendingUp, AlertCircle, CheckCircle2, Clock } from 'lucide-react'; import MethodologyFooter from './MethodologyFooter'; interface RoadmapProProps { data: RoadmapInitiative[]; } const phaseConfig: Record = { [RoadmapPhase.Automate]: { icon: Bot, color: 'text-green-700', bgColor: 'bg-green-50', label: 'Wave 1: AUTOMATE', description: 'Quick Wins (0-6 meses)', }, [RoadmapPhase.Assist]: { icon: UserCheck, color: 'text-blue-700', bgColor: 'bg-blue-50', label: 'Wave 2: ASSIST', description: 'Build Capability (6-12 meses)', }, [RoadmapPhase.Augment]: { icon: Cpu, color: 'text-purple-700', bgColor: 'bg-purple-50', label: 'Wave 3: AUGMENT', description: 'Transform (12-18 meses)', }, }; const getRiskColor = (initiative: RoadmapInitiative): string => { // Simple risk assessment based on investment and resources if (initiative.investment > 50000 || initiative.resources.length > 3) return 'text-red-500'; if (initiative.investment > 25000 || initiative.resources.length > 2) return 'text-amber-500'; return 'text-green-500'; }; const getRiskLabel = (initiative: RoadmapInitiative): string => { if (initiative.investment > 50000 || initiative.resources.length > 3) return 'Alto'; if (initiative.investment > 25000 || initiative.resources.length > 2) return 'Medio'; return 'Bajo'; }; const RoadmapPro: React.FC = ({ data }) => { // Group initiatives by phase const groupedData = useMemo(() => { try { if (!data || !Array.isArray(data)) return { [RoadmapPhase.Automate]: [], [RoadmapPhase.Assist]: [], [RoadmapPhase.Augment]: [], }; const groups: Record = { [RoadmapPhase.Automate]: [], [RoadmapPhase.Assist]: [], [RoadmapPhase.Augment]: [], }; data.forEach(item => { if (item?.phase && groups[item.phase]) { groups[item.phase].push(item); } }); return groups; } catch (error) { console.error('❌ Error in groupedData useMemo:', error); return { [RoadmapPhase.Automate]: [], [RoadmapPhase.Assist]: [], [RoadmapPhase.Augment]: [], }; } }, [data]); // Calculate summary metrics const summary = useMemo(() => { try { if (!data || !Array.isArray(data)) return { totalInvestment: 0, totalResources: 0, duration: 18, initiativeCount: 0, }; const totalInvestment = data.reduce((sum, item) => sum + (item?.investment || 0), 0); const resourceLengths = data.map(item => item?.resources?.length || 0); const totalResources = resourceLengths.length > 0 ? Math.max(0, ...resourceLengths) : 0; const duration = 18; return { totalInvestment, totalResources, duration, initiativeCount: data.length, }; } catch (error) { console.error('❌ Error in summary useMemo:', error); return { totalInvestment: 0, totalResources: 0, duration: 18, initiativeCount: 0, }; } }, [data]); // Timeline quarters (Q1 2025 - Q2 2026) const quarters = ['Q1 2025', 'Q2 2025', 'Q3 2025', 'Q4 2025', 'Q1 2026', 'Q2 2026']; // Milestones const milestones = [ { quarter: 1, label: 'Go-live Wave 1', icon: CheckCircle2, color: 'text-green-600' }, { quarter: 2, label: '50% Adoption', icon: TrendingUp, color: 'text-blue-600' }, { quarter: 3, label: 'Tier Silver', icon: CheckCircle2, color: 'text-slate-600' }, { quarter: 5, label: 'Tier Gold', icon: CheckCircle2, color: 'text-amber-600' }, ]; return (
{/* Header */}

Roadmap de Transformación: 18 meses hacia Agentic Readiness Tier Gold

Plan de Implementación en 3 olas de transformación | {data.length} iniciativas | €{((summary.totalInvestment || 0) / 1000).toFixed(0)}K inversión total

{/* Summary Cards */}
Duración Total
{summary.duration} meses
Inversión Total
€{(((summary.totalInvestment || 0)) / 1000).toFixed(0)}K
# Iniciativas
{summary.initiativeCount}
FTEs Peak
{summary.totalResources.toFixed(1)}
{/* Timeline Visual */}
{/* Timeline Bar */}
{quarters.map((quarter, index) => (
{/* Quarter Marker */}
{/* Quarter Label */}
{quarter}
{/* Connecting Line */} {index < quarters.length - 1 && (
)} {/* Milestones */} {milestones .filter(m => m.quarter === index) .map((milestone, mIndex) => (
{milestone.label}
))}
))}
{/* Waves */}
{([RoadmapPhase.Automate, RoadmapPhase.Assist, RoadmapPhase.Augment]).map((phase, phaseIndex) => { const config = phaseConfig[phase]; const Icon = config.icon; const initiatives = groupedData[phase]; return ( {/* Wave Header */}

{config.label}

{config.description}

{/* Initiatives */}
{initiatives.map((initiative, index) => { const riskColor = getRiskColor(initiative); const riskLabel = getRiskLabel(initiative); return (
{initiative.name}
Riesgo: {riskLabel}
{initiative.timeline}
€{initiative.investment.toLocaleString('es-ES')}
{initiative.resources.length} FTEs
); })}
); })}
{/* Legend */}
Indicadores de Riesgo:
Bajo riesgo
Riesgo medio (mitigable)
Alto riesgo (requiere atención)
{/* Methodology Footer */}
); }; export default RoadmapPro;