import React, { useState, useEffect, useMemo, useCallback } from 'react'; import { Play, CheckCircle, AlertTriangle, Calculator, DollarSign, TrendingUp, Database, Target, Award } from 'lucide-react'; import { LotomaniaAlgorithm } from '../utils/lotomaniaAlgorithm'; import { useLotomaniaAPI } from '../hooks/useLotomaniaAPI'; import { LotomaniaGame, LotomaniaResult } from '../types'; interface GameAnalysisResult { game: LotomaniaGame; numbers: number[]; matches: number; points: number; isWinning: boolean; prizeValue: number; prizeDescription: string; } interface FinancialSummary { totalCost: number; totalPrizes: number; netResult: number; profitMargin: number; winningGames: number; pointsDistribution: Record; prizeDistribution: Record; } export const CompleteSystemAnalysis: React.FC = () => { const [algorithm] = useState(() => new LotomaniaAlgorithm()); const [allGames, setAllGames] = useState([]); const [isAnalyzing, setIsAnalyzing] = useState(false); const [analysisResults, setAnalysisResults] = useState([]); const [financialSummary, setFinancialSummary] = useState(null); const [selectedConcurso, setSelectedConcurso] = useState(''); const { latestResult, fetchLatestResult, analyzeGameResult } = useLotomaniaAPI(); // Verificar e gerar todos os jogos useEffect(() => { console.log('🚀 Iniciando geração completa de jogos...'); const startTime = performance.now(); const games = algorithm.generateAllGames(); const endTime = performance.now(); console.log(`✅ Jogos gerados em ${(endTime - startTime).toFixed(2)}ms`); console.log(`📊 Total de jogos: ${games.length}`); const verticalGames = algorithm.getVerticalGames(); const horizontalGames = algorithm.getHorizontalGames(); console.log(`🔹 Jogos Verticais: ${verticalGames.length}`); console.log(`🔸 Jogos Horizontais: ${horizontalGames.length}`); setAllGames(games); }, [algorithm]); // Estatísticas dos jogos const gameStats = useMemo(() => { if (allGames.length === 0) return null; const verticalGames = allGames.filter(g => g.type === 'vertical'); const horizontalGames = allGames.filter(g => g.type === 'horizontal'); const stats = algorithm.getGameStatistics(); return { ...stats, verticalCount: verticalGames.length, horizontalCount: horizontalGames.length, isCorrect: verticalGames.length === 252 && horizontalGames.length === 252, expectedTotal: 504, actualTotal: allGames.length }; }, [allGames, algorithm]); // Análise completa contra resultado da Lotomania const performCompleteAnalysis = useCallback(async () => { if (!latestResult || allGames.length === 0) { console.error('❌ Dados insuficientes para análise'); return; } setIsAnalyzing(true); console.log('🔄 Iniciando análise completa de todos os jogos...'); console.log(`📊 Analisando ${allGames.length} jogos contra concurso ${latestResult.concurso}`); const startTime = performance.now(); const results: GameAnalysisResult[] = []; for (let i = 0; i < allGames.length; i++) { const game = allGames[i]; const gameNumbers = algorithm.getNumbersFromGame(game); const analysis = analyzeGameResult(gameNumbers, latestResult); // Calcular valor do prêmio baseado nos dados oficiais let prizeValue = 0; let prizeDescription = 'Sem prêmio'; if (analysis.points >= 15 || analysis.points === 0) { const premio = latestResult.premiacoes?.find(p => p.acertos === analysis.points); if (premio) { prizeValue = premio.valorPremio; prizeDescription = premio.descricao; } } results.push({ game, numbers: gameNumbers, matches: analysis.matches, points: analysis.points, isWinning: analysis.isWinning, prizeValue, prizeDescription }); // Log progresso a cada 100 jogos if ((i + 1) % 100 === 0) { console.log(`📈 Analisados ${i + 1}/${allGames.length} jogos...`); } } const endTime = performance.now(); console.log(`✅ Análise completa em ${(endTime - startTime).toFixed(2)}ms`); setAnalysisResults(results); // Calcular resumo financeiro const GAME_COST = 3.00; // R$ 3,00 por jogo const totalCost = allGames.length * GAME_COST; const totalPrizes = results.reduce((sum, r) => sum + r.prizeValue, 0); const netResult = totalPrizes - totalCost; const profitMargin = totalCost > 0 ? (netResult / totalCost) * 100 : 0; const winningGames = results.filter(r => r.isWinning).length; // Distribuição de pontos const pointsDistribution: Record = {}; const prizeDistribution: Record = {}; results.forEach(r => { pointsDistribution[r.points] = (pointsDistribution[r.points] || 0) + 1; if (r.isWinning) { if (!prizeDistribution[r.points]) { prizeDistribution[r.points] = { count: 0, totalValue: 0 }; } prizeDistribution[r.points].count++; prizeDistribution[r.points].totalValue += r.prizeValue; } }); const financial: FinancialSummary = { totalCost, totalPrizes, netResult, profitMargin, winningGames, pointsDistribution, prizeDistribution }; setFinancialSummary(financial); // Log resumo final console.log('💰 ===== ANÁLISE FINANCEIRA COMPLETA ====='); console.log(`💸 Custo Total: R$ ${totalCost.toLocaleString('pt-BR', { minimumFractionDigits: 2 })}`); console.log(`🏆 Prêmios Totais: R$ ${totalPrizes.toLocaleString('pt-BR', { minimumFractionDigits: 2 })}`); console.log(`📊 Resultado Líquido: R$ ${netResult.toLocaleString('pt-BR', { minimumFractionDigits: 2 })}`); console.log(`📈 Margem: ${profitMargin.toFixed(2)}%`); console.log(`🎯 Jogos Premiados: ${winningGames}/${allGames.length} (${((winningGames/allGames.length)*100).toFixed(2)}%)`); setIsAnalyzing(false); }, [latestResult, allGames, algorithm, analyzeGameResult]); // Auto-executar análise quando resultado estiver disponível useEffect(() => { if (latestResult && allGames.length > 0 && analysisResults.length === 0) { performCompleteAnalysis(); } }, [latestResult, allGames, analysisResults.length, performCompleteAnalysis]); // Buscar resultado mais recente ao carregar useEffect(() => { fetchLatestResult(); }, [fetchLatestResult]); return (
{/* Header */}

Análise Completa do Sistema Lotomania

Verificação completa da lógica, geração de jogos e análise financeira detalhada

{/* Verificação do Algoritmo */}

Verificação do Algoritmo

{gameStats ? (
{gameStats.isCorrect ? ( ) : ( )} Status

{gameStats.isCorrect ? 'Algoritmo Correto ✅' : 'Algoritmo com Problemas ❌'}

Total de Jogos

{gameStats.actualTotal}

Esperado: {gameStats.expectedTotal}

Jogos Verticais

{gameStats.verticalCount}

Esperado: 252

Jogos Horizontais

{gameStats.horizontalCount}

Esperado: 252

) : (
)}
{/* Informações do Resultado da Lotomania */} {latestResult && (

Resultado Oficial da Lotomania

Concurso

{latestResult.concurso}

Data

{latestResult.data}

Valor Arrecadado

R$ {(latestResult.valorArrecadado || 0).toLocaleString('pt-BR')}

Status

{latestResult.acumulado ? 'Acumulou' : 'Teve Ganhador'}

{/* Números Sorteados */}

Números Sorteados:

{latestResult.numeros.map((numero, index) => (
{numero === 0 ? '00' : numero.toString().padStart(2, '0')}
))}
)} {/* Controles de Análise */}

Análise Completa

{analysisResults.length > 0 && (
✅ Análise completa realizada com {analysisResults.length} jogos
)}
{/* Resumo Financeiro */} {financialSummary && (

Análise Financeira Completa

Custo Total

R$ {financialSummary.totalCost.toLocaleString('pt-BR', { minimumFractionDigits: 2 })}

{allGames.length} jogos × R$ 3,00

Prêmios Totais

R$ {financialSummary.totalPrizes.toLocaleString('pt-BR', { minimumFractionDigits: 2 })}

{financialSummary.winningGames} jogos premiados

= 0 ? 'border-blue-500 bg-blue-50' : 'border-orange-500 bg-orange-50' }`}> = 0 ? 'text-blue-600' : 'text-orange-600' }`}> Resultado Líquido

= 0 ? 'text-blue-800' : 'text-orange-800' }`}> {financialSummary.netResult >= 0 ? '+' : ''}R$ {financialSummary.netResult.toLocaleString('pt-BR', { minimumFractionDigits: 2 })}

= 0 ? 'text-blue-600' : 'text-orange-600' }`}> {financialSummary.profitMargin >= 0 ? 'Lucro' : 'Prejuízo'}: {Math.abs(financialSummary.profitMargin).toFixed(2)}%

Taxa de Acerto

{((financialSummary.winningGames / allGames.length) * 100).toFixed(2)}%

{financialSummary.winningGames} de {allGames.length} jogos

{/* Distribuição de Pontos */}

Distribuição de Pontos:

{Object.entries(financialSummary.pointsDistribution) .sort(([a], [b]) => parseInt(b) - parseInt(a)) .map(([points, count]) => { const prize = financialSummary.prizeDistribution[parseInt(points)]; const isWinning = prize && prize.count > 0; return (
{points} pts
{count} jogos
{isWinning && (
R$ {prize.totalValue.toLocaleString('pt-BR', { maximumFractionDigits: 0 })}
)}
); })}
)} {/* Confirmação do Sistema */}

Confirmação do Sistema

Algoritmo Verified: Gera exatamente {gameStats?.actualTotal} jogos conforme especificado

Jogos Verticais: {gameStats?.verticalCount} jogos (colunas marcadas)

Jogos Horizontais: {gameStats?.horizontalCount} jogos (linhas marcadas)

Comparação Real: Cada jogo é comparado com resultado oficial da Caixa

Análise Financeira: Custo total vs. prêmios reais obtidos

Dados Oficiais: API da Caixa Econômica Federal integrada

); }; export default CompleteSystemAnalysis;