import React, { useState, useEffect } from 'react'; import { useTranslation } from 'react-i18next'; import { Calculator, TrendingUp, Clock, DollarSign, ArrowRight, Sparkles, ChevronDown, ChevronUp } from 'lucide-react'; import { Card, Button } from '../ui'; import type { SubscriptionTier } from '../../api'; type DisplayContext = 'landing' | 'settings' | 'modal'; interface ROICalculatorProps { currentTier: SubscriptionTier; targetTier: SubscriptionTier; monthlyPrice: number; context?: DisplayContext; onUpgrade?: () => void; className?: string; defaultExpanded?: boolean; } interface BakeryMetrics { dailySales: number; currentWastePercentage: number; employees: number; hoursPerWeekOnManualTasks: number; } interface ROIResults { monthlySavings: number; wasteSavings: number; timeSavings: number; laborCostSavings: number; paybackPeriodDays: number; annualROI: number; breakEvenDate: string; } export const ROICalculator: React.FC = ({ currentTier, targetTier, monthlyPrice, context = 'settings', onUpgrade, className = '', defaultExpanded = false }) => { const { t } = useTranslation('subscription'); // Default values based on typical bakery const [metrics, setMetrics] = useState({ dailySales: 1500, currentWastePercentage: 15, employees: 3, hoursPerWeekOnManualTasks: 15 }); const [results, setResults] = useState(null); const [isExpanded, setIsExpanded] = useState(defaultExpanded || context === 'modal'); // Calculate ROI whenever metrics change useEffect(() => { calculateROI(); }, [metrics, monthlyPrice]); const calculateROI = () => { const { dailySales, currentWastePercentage, employees, hoursPerWeekOnManualTasks } = metrics; // Waste reduction estimates (based on actual customer data) // Professional tier: 15% → 8% (7 percentage points reduction) // Enterprise tier: 15% → 5% (10 percentage points reduction) const wasteReductionPercentagePoints = targetTier === 'professional' ? 7 : 10; const improvedWastePercentage = Math.max( currentWastePercentage - wasteReductionPercentagePoints, 3 // Minimum achievable waste ); // Monthly waste savings const monthlySales = dailySales * 30; const currentWasteCost = monthlySales * (currentWastePercentage / 100); const improvedWasteCost = monthlySales * (improvedWastePercentage / 100); const wasteSavings = currentWasteCost - improvedWasteCost; // Time savings (automation reduces manual tasks by 60-80%) const timeSavingPercentage = targetTier === 'professional' ? 0.6 : 0.75; const weeklySavedHours = hoursPerWeekOnManualTasks * timeSavingPercentage; const monthlySavedHours = weeklySavedHours * 4.33; // Average weeks per month // Labor cost savings (€15/hour average bakery labor cost) const laborCostPerHour = 15; const laborCostSavings = monthlySavedHours * laborCostPerHour; // Total monthly savings const monthlySavings = wasteSavings + laborCostSavings; // Payback period const paybackPeriodDays = Math.max( Math.round((monthlyPrice / monthlySavings) * 30), 1 ); // Annual ROI const annualCost = monthlyPrice * 12; const annualSavings = monthlySavings * 12; const annualROI = ((annualSavings - annualCost) / annualCost) * 100; // Break-even date const today = new Date(); const breakEvenDate = new Date(today); breakEvenDate.setDate(today.getDate() + paybackPeriodDays); setResults({ monthlySavings, wasteSavings, timeSavings: weeklySavedHours, laborCostSavings, paybackPeriodDays, annualROI, breakEvenDate: breakEvenDate.toLocaleDateString('en-US', { month: 'short', day: 'numeric', year: 'numeric' }) }); }; const handleInputChange = (field: keyof BakeryMetrics, value: string) => { const numValue = parseFloat(value) || 0; setMetrics(prev => ({ ...prev, [field]: numValue })); }; const formatCurrency = (amount: number) => { return `€${Math.round(amount).toLocaleString()}`; }; // Render compact summary for landing page const renderCompactSummary = () => { if (!results) return null; return (

Estimated Monthly Savings

{formatCurrency(results.monthlySavings)}

Payback in

{results.paybackPeriodDays} days

); }; // Compact view for landing page - no inputs, just results if (context === 'landing') { return (
{renderCompactSummary()}
); } // Collapsible view for settings page const isCollapsible = context === 'settings'; return ( {/* Header */}
setIsExpanded(!isExpanded) : undefined} >

ROI Calculator

Calculate your savings with {targetTier.charAt(0).toUpperCase() + targetTier.slice(1)}

{isCollapsible && ( )}
{/* Compact summary when collapsed */} {isCollapsible && !isExpanded && renderCompactSummary()} {/* Full calculator when expanded or in modal mode */} {(isExpanded || !isCollapsible) && ( <> {/* Input Form */}
{/* Daily Sales */}
handleInputChange('dailySales', e.target.value)} className="w-full pl-8 pr-4 py-2 border-2 border-[var(--border-primary)] rounded-lg bg-[var(--bg-primary)] text-[var(--text-primary)] focus:border-[var(--color-primary)] focus:ring-2 focus:ring-[var(--color-primary)]/20 outline-none transition-all" placeholder="1500" min="0" step="100" />
{/* Current Waste */}
handleInputChange('currentWastePercentage', e.target.value)} className="w-full pr-8 pl-4 py-2 border-2 border-[var(--border-primary)] rounded-lg bg-[var(--bg-primary)] text-[var(--text-primary)] focus:border-[var(--color-primary)] focus:ring-2 focus:ring-[var(--color-primary)]/20 outline-none transition-all" placeholder="15" min="0" max="100" step="1" /> %

Industry average: 12-18%

{/* Employees */}
handleInputChange('employees', e.target.value)} className="w-full px-4 py-2 border-2 border-[var(--border-primary)] rounded-lg bg-[var(--bg-primary)] text-[var(--text-primary)] focus:border-[var(--color-primary)] focus:ring-2 focus:ring-[var(--color-primary)]/20 outline-none transition-all" placeholder="3" min="1" step="1" />
{/* Manual Tasks */}
handleInputChange('hoursPerWeekOnManualTasks', e.target.value)} className="w-full px-4 py-2 border-2 border-[var(--border-primary)] rounded-lg bg-[var(--bg-primary)] text-[var(--text-primary)] focus:border-[var(--color-primary)] focus:ring-2 focus:ring-[var(--color-primary)]/20 outline-none transition-all" placeholder="15" min="0" step="1" />

Inventory counts, order planning, waste tracking, etc.

{/* Results */} {results && (
{/* Divider */}

Your Estimated Savings

{/* Monthly Savings */}
Monthly Savings
{formatCurrency(results.monthlySavings)}
Waste reduction: {formatCurrency(results.wasteSavings)}/mo
Labor cost savings: {formatCurrency(results.laborCostSavings)}/mo
{/* Time Savings */}
Time Saved
{results.timeSavings.toFixed(1)} hours/week
{/* Payback Period */}
Payback Period
{results.paybackPeriodDays} days
{/* Break-even Date */}

You'll break even by {results.breakEvenDate}

{/* Annual ROI */}

Annual ROI

{results.annualROI > 0 ? '+' : ''}{Math.round(results.annualROI)}%

{formatCurrency(results.monthlySavings * 12)}/year savings vs {formatCurrency(monthlyPrice * 12)}/year cost

{/* Upgrade CTA */} {onUpgrade && ( )} {/* Disclaimer */}

*Estimates based on average bakery performance. Actual results may vary based on your specific operations, usage patterns, and implementation.

)} )}
); };