import React, { useState, useEffect } from 'react';import { LineChart, Line, XAxis, YAxis, CartesianGrid, Tooltip, Legend, ResponsiveContainer } from 'recharts';import { Moon, Sun } from 'lucide-react';const CapitalCalculator = () => { const [formData, setFormData] = useState({ etapas: 10, valorInicial: 10, taxaAumento: 50, niveis: 13, capitalInicial: 0, diasPorEtapa: 7, valorRetirada: 0, percentualRetirada: 0, tipoRetirada: "nenhuma", valorAporte: 0, frequenciaAporte: 1, frequenciaRetirada: 1 }); const [resultado, setResultado] = useState(0); const [resultadoLiquido, setResultadoLiquido] = useState(0); const [tabelaResultados, setTabelaResultados] = useState([]); const [darkMode, setDarkMode] = useState(false); const [graphControls, setGraphControls] = useState({ mostrarCapitalAcumulado: true, mostrarCapitalLiquido: true, mostrarValorNivel: true, mostrarAportes: false, mostrarRetiradas: false }); const formatarNumero = (numero) => { return parseFloat(numero).toLocaleString('en-US', { minimumFractionDigits: 2, maximumFractionDigits: 2 }); }; const formatarData = (dias) => { const hoje = new Date(); const dataFutura = new Date(hoje); dataFutura.setDate(hoje.getDate() + dias); return dataFutura.toLocaleDateString(); }; const calcularCapital = () => { const { etapas, valorInicial, taxaAumento, niveis, capitalInicial, diasPorEtapa, valorRetirada, percentualRetirada, tipoRetirada, valorAporte, frequenciaAporte, frequenciaRetirada } = formData; const E = parseInt(etapas); const V = parseFloat(valorInicial); const T = parseFloat(taxaAumento) / 100; const N = parseInt(niveis); const CI = parseFloat(capitalInicial); const novaTabela = []; let capitalAcumuladoAtual = CI; let capitalLiquidoAtual = CI; let diasAcumulados = 0; let nivelAtual = 1; while (nivelAtual <= N) { const valorEtapa = V * Math.pow(1 + T, nivelAtual - 1); const valorNivel = E * valorEtapa; const diasNivel = E * diasPorEtapa; diasAcumulados += diasNivel; capitalAcumuladoAtual += valorNivel; capitalLiquidoAtual += valorNivel; let valorAporteNivel = 0; let niveisAvancados = 0; let diasEconomizados = 0; let niveisRetrocedidos = 0; let diasPerdidos = 0; if (valorAporte > 0 && nivelAtual % frequenciaAporte === 0) { valorAporteNivel = valorAporte; if (nivelAtual < N) { let aporteRestante = valorAporteNivel; let nivelTemp = nivelAtual + 1; while (aporteRestante > 0 && nivelTemp <= N) { const proxValorEtapa = V * Math.pow(1 + T, nivelTemp - 1); const proxValorNivel = E * proxValorEtapa; if (aporteRestante >= proxValorNivel) { aporteRestante -= proxValorNivel; niveisAvancados++; diasEconomizados += E * diasPorEtapa; nivelTemp++; } else { break; } } capitalLiquidoAtual += aporteRestante; } else { capitalLiquidoAtual += valorAporteNivel; } } let valorRetiradaNivel = 0; let retiradaExtrema = false; if (tipoRetirada !== "nenhuma" && nivelAtual % frequenciaRetirada === 0) { if (tipoRetirada === "percentual" && percentualRetirada > 0) { valorRetiradaNivel = capitalLiquidoAtual * (percentualRetirada / 100); } else if (tipoRetirada === "valor" && valorRetirada > 0) { valorRetiradaNivel = Math.min(valorRetirada, capitalLiquidoAtual); } else if (tipoRetirada === "valorEtapa") { valorRetiradaNivel = valorEtapa; } capitalLiquidoAtual = Math.max(0, capitalLiquidoAtual - valorRetiradaNivel); if (capitalLiquidoAtual < 0.5 * valorNivel && nivelAtual > 1) { let nivelRetorno = nivelAtual - 1; let contadorSeguranca = 0; const limiteRetrocessos = 10; while (nivelRetorno >= 1) { const nivelAnteriorValorEtapa = V * Math.pow(1 + T, nivelRetorno - 1); const nivelAnteriorValorNivel = E * nivelAnteriorValorEtapa; contadorSeguranca++; if (capitalLiquidoAtual >= nivelAnteriorValorNivel * 0.5 || contadorSeguranca >= limiteRetrocessos) { if (contadorSeguranca >= limiteRetrocessos) { retiradaExtrema = true; nivelRetorno = 1; } break; } niveisRetrocedidos++; diasPerdidos += E * diasPorEtapa; nivelRetorno--; } if (niveisRetrocedidos > 0) { nivelAtual = Math.max(1, nivelRetorno); } } } novaTabela.push({ nivel: nivelAtual, valorEtapa: valorEtapa.toFixed(2), valorNivel: valorNivel.toFixed(2), capitalAcumulado: capitalAcumuladoAtual.toFixed(2), capitalLiquido: capitalLiquidoAtual.toFixed(2), valorEtapaFormatado: formatarNumero(valorEtapa), valorNivelFormatado: formatarNumero(valorNivel), capitalAcumuladoFormatado: formatarNumero(capitalAcumuladoAtual), capitalLiquidoFormatado: formatarNumero(capitalLiquidoAtual), diasNivel: diasNivel, diasAcumulados: diasAcumulados, dataEstimada: formatarData(diasAcumulados), valorRetirada: valorRetiradaNivel.toFixed(2), valorRetiradaFormatado: formatarNumero(valorRetiradaNivel), valorAporte: valorAporteNivel.toFixed(2), valorAporteFormatado: formatarNumero(valorAporteNivel), niveisAvancados: niveisAvancados, diasEconomizados: diasEconomizados, niveisRetrocedidos: niveisRetrocedidos || 0, diasPerdidos: diasPerdidos || 0, retiradaExtrema: retiradaExtrema || false }); if (niveisAvancados > 0) { diasAcumulados -= diasEconomizados; nivelAtual += niveisAvancados; if (nivelAtual > N) { break; } } else if (niveisRetrocedidos > 0) { diasAcumulados += diasPerdidos; } else { nivelAtual++; } } setResultado(capitalAcumuladoAtual); setResultadoLiquido(capitalLiquidoAtual); setTabelaResultados(novaTabela); }; const exportarCSV = () => { let csvContent = "Nível,Valor por Etapa,Valor do Nível,Aporte,Retirada,Níveis Pulados,Níveis Perdidos,Capital Acumulado,Capital Líquido,Datan"; tabelaResultados.forEach(item => { csvContent += `${item.nivel},${item.valorEtapa},${item.valorNivel},${item.valorAporte},${item.valorRetirada},${item.niveisAvancados || 0},${item.niveisRetrocedidos || 0},${item.capitalAcumulado},${item.capitalLiquido},${item.dataEstimada}n`; }); const blob = new Blob([csvContent], { type: 'text/csv;charset=utf-8;' }); const url = URL.createObjectURL(blob); const link = document.createElement('a'); link.setAttribute('href', url); link.setAttribute('download', 'capital_acumulado.csv'); link.style.visibility = 'hidden'; document.body.appendChild(link); link.click(); document.body.removeChild(link); }; const exportarPDF = () => { const printWindow = window.open('', '_blank'); if (!printWindow) { alert("Seu navegador bloqueou a janela pop-up. Por favor, permita pop-ups para este site e tente novamente."); return; } printWindow.document.write(` Calculadora de Capital Acumulado - Resultados

Calculadora de Capital Acumulado

Data: ${new Date().toLocaleDateString()}

Resumo dos Resultados

Capital bruto final:
$${formatarNumero(resultado)}
Capital líquido final:
$${formatarNumero(resultadoLiquido)}
Tempo estimado:
${tabelaResultados.length > 0 ? `${tabelaResultados[tabelaResultados.length - 1].diasAcumulados} dias (${Math.round(tabelaResultados[tabelaResultados.length - 1].diasAcumulados / 30)} meses)` : '0 dias'}
Níveis pulados com aportes:
${tabelaResultados.reduce((total, item) => total + (item.niveisAvancados || 0), 0)} níveis
Níveis perdidos com retiradas:
${tabelaResultados.reduce((total, item) => total + (item.niveisRetrocedidos || 0), 0)} níveis

Parâmetros Utilizados

Etapas por nível: ${formData.etapas}
Valor inicial: $${formData.valorInicial}
Taxa de aumento: ${formData.taxaAumento}%
Número de níveis: ${formData.niveis}
Capital inicial: $${formData.capitalInicial}
Dias por etapa: ${formData.diasPorEtapa}

Tabela de Progressão

${tabelaResultados.map(item => ` `).join('')}
Nível Valor/Etapa Valor do Nível Aporte Níveis Pulados Retirada Níveis Perdidos Cap. Bruto Cap. Líquido Data
${item.nivel} $${item.valorEtapaFormatado} $${item.valorNivelFormatado} $${item.valorAporteFormatado} ${item.niveisAvancados > 0 ? `+${item.niveisAvancados}` : '-'} $${item.valorRetiradaFormatado} ${item.niveisRetrocedidos > 0 ? `-${item.niveisRetrocedidos}` : '-'} $${item.capitalAcumuladoFormatado} $${item.capitalLiquidoFormatado} ${item.dataEstimada}

Calculadora de Capital Acumulado para estratégia de trading de criptomoedas

`); printWindow.document.close(); printWindow.focus(); setTimeout(() => { printWindow.print(); }, 300); }; useEffect(() => { calcularCapital(); }, [formData]); const handleInputChange = (e) => { const { name, value, type } = e.target; setFormData(prev => ({ ...prev, [name]: type === 'number' ? (value === '' ? 0 : parseFloat(value)) : value })); }; const toggleGraphControl = (control) => { setGraphControls(prev => ({ ...prev, [control]: !prev[control] })); }; return (
{}

Calculadora de Capital Acumulado

{}
{}

Parâmetros da Fórmula

{}

Configurações Adicionais

{formData.tipoRetirada === "percentual" && (
)} {formData.tipoRetirada === "valor" && (
)} {formData.tipoRetirada !== "nenhuma" && (
)}
{}

Resultado

Capital bruto após {tabelaResultados.length > 0 ? tabelaResultados[tabelaResultados.length - 1].nivel : 0} níveis:
${formatarNumero(resultado)}
Capital líquido (com aportes e retiradas):
${formatarNumero(resultadoLiquido)}
Tempo estimado:
{tabelaResultados.length > 0 ? `${tabelaResultados[tabelaResultados.length - 1].diasAcumulados} dias (${Math.round(tabelaResultados[tabelaResultados.length - 1].diasAcumulados / 30)} meses)` : '0 dias'}
Níveis pulados com aportes:
{tabelaResultados.reduce((total, item) => total + (item.niveisAvancados || 0), 0)} níveis
Dias economizados com aportes:
{tabelaResultados.reduce((total, item) => total + (item.diasEconomizados || 0), 0)} dias
Níveis perdidos com retiradas:
{tabelaResultados.reduce((total, item) => total + (item.niveisRetrocedidos || 0), 0)} níveis
Informações Importantes:
{tabelaResultados.some(item => item.retiradaExtrema) ? ( ⚠️ Retiradas muito altas detectadas! Isso causou retrocessos extremos em sua estratégia. ) : ( Nenhum problema detectado na estratégia. )}
{}

Gráfico de Progressão

{(formData.tipoRetirada === "percentual" || formData.tipoRetirada === "valor" || formData.tipoRetirada === "valorEtapa") && ( )}
{ if (typeof value === 'string' && !isNaN(parseFloat(value))) { return [' + formatarNumero(parseFloat(value))]; } return [value]; }} /> {graphControls.mostrarCapitalAcumulado && ( )} {graphControls.mostrarCapitalLiquido && ( )} {graphControls.mostrarValorNivel && ( )} {graphControls.mostrarAportes && ( )} {graphControls.mostrarRetiradas && (formData.tipoRetirada !== "nenhuma") && ( )}
{}

Tabela de Progressão

{tabelaResultados.slice(0, 20).map(item => ( ))}
Nível Valor/Etapa Valor do Nível Aporte Níveis Pulados Retirada Níveis Perdidos Cap. Bruto Cap. Líquido Data
{item.nivel} ${item.valorEtapaFormatado} ${item.valorNivelFormatado} ${item.valorAporteFormatado} 0 ? (darkMode ? 'text-green-400' : 'text-green-600') + ' font-medium' : ''}`}> {item.niveisAvancados > 0 ? `+${item.niveisAvancados}` : '-'} ${item.valorRetiradaFormatado} 0 ? (darkMode ? 'text-red-400' : 'text-red-600') + ' font-medium' : ''}`}> {item.niveisRetrocedidos > 0 ? `-${item.niveisRetrocedidos}` : '-'} ${item.capitalAcumuladoFormatado} ${item.capitalLiquidoFormatado} {item.dataEstimada}
{tabelaResultados.length > 20 && (
Mostrando os primeiros 20 níveis de {tabelaResultados.length}
)}