'use client'; import React, { useState, useEffect } from 'react'; import { Calculator, TrendingUp, ShieldCheck, Sparkles } from 'lucide-react'; export default function BudgetSimulator() { const [spend, setSpend] = useState(1000); const [channel, setChannel] = useState('meta'); const [simulation, setSimulation] = useState(null); const [loading, setLoading] = useState(false); useEffect(() => { const timer = setTimeout(() => { fetchSimulation(spend, channel); }, 200); return () => clearTimeout(timer); }, [spend, channel]); async function fetchSimulation(amount: number, ch: string) { setLoading(true); try { const res = await fetch('/api/simulate', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ spend: amount, channel: ch }) }); if (res.ok) { const data = await res.json(); setSimulation(data); } } catch (e) { console.error('Error simulating budget:', e); } finally { setLoading(false); } } const p10 = simulation?.conservative_p10 || {}; const p50 = simulation?.expected_p50 || {}; const p90 = simulation?.optimistic_p90 || {}; const baseline = simulation?.baseline || {}; return (

Simulador Determinista "¿Qué pasa si...?"

Proyección matemática basada en el histórico de CPL, tasa de cierre y ticket medio en Supabase.

{['meta', 'google', 'tiktok', 'blended'].map((ch) => ( ))}
{/* Control del presupuesto */}
{spend.toLocaleString('es-ES')} €
setSpend(Number(e.target.value))} className="w-full accent-brand-500 bg-gray-800 rounded-lg cursor-pointer h-2" />
200 € 2.500 € 5.000 € 10.000 €
{/* Baseline Info */}
Parámetros Base Reales: CPL Histórico: {Number(baseline.historical_cpl || 0).toFixed(2)} € Tasa Cierre: {baseline.conversion_rate_pct || 0}% Ticket Medio: {Number(baseline.avg_ticket || 0).toLocaleString('es-ES')} €
{/* Las 3 Bandas de Confianza */}
{/* Conservador p10 */}
Conservador (p10)

+{Number(p10.revenue || 0).toLocaleString('es-ES', { minimumFractionDigits: 2 })} €

ROAS {p10.roas || 0}x

Leads estimados: {p10.leads || 0}
Ventas cerradas: {p10.deals || 0}
{/* Esperado p50 (Destacado) */}
Más Probable
Esperado (p50)

+{Number(p50.revenue || 0).toLocaleString('es-ES', { minimumFractionDigits: 2 })} €

ROAS {p50.roas || 0}x

Leads estimados: {p50.leads || 0}
Ventas cerradas: {p50.deals || 0}
{/* Optimista p90 */}
Optimista (p90)

+{Number(p90.revenue || 0).toLocaleString('es-ES', { minimumFractionDigits: 2 })} €

ROAS {p90.roas || 0}x

Leads estimados: {p90.leads || 0}
Ventas cerradas: {p90.deals || 0}
); }