import { motion } from 'framer-motion';
import { Zap, Clock, DollarSign, TrendingUp, AlertTriangle, CheckCircle, ArrowRight } from 'lucide-react';
import { WaterfallChart, WaterfallDataPoint } from '../charts/WaterfallChart';
import type { AnalysisData, RoadmapInitiative, RoadmapPhase } from '../../types';
interface RoadmapTabProps {
data: AnalysisData;
}
// Quick Wins Section
function QuickWins({ initiatives, economicModel }: {
initiatives: RoadmapInitiative[];
economicModel: AnalysisData['economicModel'];
}) {
// Filter for quick wins (low investment, quick timeline)
const quickWins = initiatives
.filter(i => i.phase === RoadmapPhase.Automate || i.risk === 'low')
.slice(0, 3);
if (quickWins.length === 0) {
// Create synthetic quick wins from savings breakdown
const topSavings = economicModel.savingsBreakdown.slice(0, 3);
return (
Quick Wins Identificados
{topSavings.map((saving, idx) => (
{saving.category}
€{saving.amount.toLocaleString()}
{saving.percentage}% del ahorro total
))}
);
}
return (
Quick Wins
{quickWins.map((initiative) => (
{initiative.name}
{initiative.timeline}
€{initiative.investment.toLocaleString()} inversión
))}
);
}
// Initiative Card
function InitiativeCard({ initiative, delay = 0 }: { initiative: RoadmapInitiative; delay?: number }) {
const phaseColors = {
[RoadmapPhase.Automate]: 'bg-emerald-100 text-emerald-700 border-emerald-200',
[RoadmapPhase.Assist]: 'bg-[#6D84E3]/20 text-[#6D84E3] border-[#6D84E3]/30',
[RoadmapPhase.Augment]: 'bg-amber-100 text-amber-700 border-amber-200'
};
const riskColors = {
low: 'text-emerald-600',
medium: 'text-amber-600',
high: 'text-red-600'
};
return (
{initiative.name}
{initiative.phase}
{initiative.risk && (
Riesgo {initiative.risk === 'low' ? 'Bajo' : initiative.risk === 'medium' ? 'Medio' : 'Alto'}
)}
{initiative.timeline}
€{initiative.investment.toLocaleString()}
{initiative.resources.length > 0 && (
{initiative.resources.slice(0, 3).map((resource, idx) => (
{resource}
))}
)}
);
}
// Business Case Summary
function BusinessCaseSummary({ economicModel }: { economicModel: AnalysisData['economicModel'] }) {
return (
Business Case Consolidado
Inversión Total
€{economicModel.initialInvestment.toLocaleString()}
Ahorro Anual
€{economicModel.annualSavings.toLocaleString()}
Payback
{economicModel.paybackMonths} meses
ROI 3 Años
{economicModel.roi3yr}%
{/* Savings Breakdown */}
Desglose de Ahorros:
{economicModel.savingsBreakdown.map((item, idx) => (
{item.category}
€{item.amount.toLocaleString()}
{item.percentage}%
))}
);
}
// Timeline Visual
function TimelineVisual({ initiatives }: { initiatives: RoadmapInitiative[] }) {
const phases = [
{ phase: RoadmapPhase.Automate, label: 'Wave 1: Automatizar', color: 'bg-emerald-500' },
{ phase: RoadmapPhase.Assist, label: 'Wave 2: Asistir', color: 'bg-[#6D84E3]' },
{ phase: RoadmapPhase.Augment, label: 'Wave 3: Aumentar', color: 'bg-amber-500' }
];
return (
Timeline de Implementación
{/* Timeline line */}
{/* Phases */}
{phases.map((phase, idx) => {
const phaseInitiatives = initiatives.filter(i => i.phase === phase.phase);
return (
{/* Circle */}
{idx + 1}
{/* Label */}
{phase.label}
{/* Count */}
{phaseInitiatives.length} iniciativa{phaseInitiatives.length !== 1 ? 's' : ''}
);
})}
{/* Arrows */}
);
}
export function RoadmapTab({ data }: RoadmapTabProps) {
// Generate waterfall data from economic model
const waterfallData: WaterfallDataPoint[] = [
{
label: 'Coste Actual',
value: data.economicModel.currentAnnualCost,
cumulative: data.economicModel.currentAnnualCost,
type: 'initial'
},
{
label: 'Inversión Inicial',
value: data.economicModel.initialInvestment,
cumulative: data.economicModel.currentAnnualCost + data.economicModel.initialInvestment,
type: 'increase'
},
...data.economicModel.savingsBreakdown.map((saving, idx) => ({
label: saving.category,
value: saving.amount,
cumulative: data.economicModel.currentAnnualCost + data.economicModel.initialInvestment -
data.economicModel.savingsBreakdown.slice(0, idx + 1).reduce((sum, s) => sum + s.amount, 0),
type: 'decrease' as const
})),
{
label: 'Coste Futuro',
value: data.economicModel.futureAnnualCost,
cumulative: data.economicModel.futureAnnualCost,
type: 'total'
}
];
// Group initiatives by phase
const automateInitiatives = data.roadmap.filter(i => i.phase === RoadmapPhase.Automate);
const assistInitiatives = data.roadmap.filter(i => i.phase === RoadmapPhase.Assist);
const augmentInitiatives = data.roadmap.filter(i => i.phase === RoadmapPhase.Augment);
return (
{/* Quick Wins */}
{/* Timeline Visual */}
{/* Waterfall Chart */}
{/* Initiatives by Phase */}
{/* Wave 1: Automate */}
Wave 1: Automatizar
{automateInitiatives.length > 0 ? (
automateInitiatives.map((init, idx) => (
))
) : (
Sin iniciativas en esta fase
)}
{/* Wave 2: Assist */}
Wave 2: Asistir
{assistInitiatives.length > 0 ? (
assistInitiatives.map((init, idx) => (
))
) : (
Sin iniciativas en esta fase
)}
{/* Wave 3: Augment */}
Wave 3: Aumentar
{augmentInitiatives.length > 0 ? (
augmentInitiatives.map((init, idx) => (
))
) : (
Sin iniciativas en esta fase
)}
{/* Business Case Summary */}
);
}
export default RoadmapTab;