import React, { useState, useEffect, useCallback } from 'react'; import { Trophy, Target, RefreshCw, AlertCircle, Loader, BarChart3, Award } from 'lucide-react'; import { LotomaniaGame, LotomaniaResult } from '../types'; import { useLotomaniaAPI } from '../hooks/useLotomaniaAPI'; import { LotomaniaAlgorithm } from '../utils/lotomaniaAlgorithm'; import { Bar } from 'react-chartjs-2'; import '../utils/chartSetup'; // Importar configuração do Chart.js interface ResultsAnalysisProps { verticalGames: LotomaniaGame[]; horizontalGames: LotomaniaGame[]; algorithm: LotomaniaAlgorithm; } interface GameAnalysis { game: LotomaniaGame; result: LotomaniaResult; matches: number; points: number; isWinning: boolean; matchedNumbers: number[]; prize: string; } const ResultsAnalysis: React.FC = ({ verticalGames, horizontalGames, algorithm }) => { const [activeTab, setActiveTab] = useState<'vertical' | 'horizontal' | 'comparison'>('vertical'); const [analysisFilter, setAnalysisFilter] = useState<'all' | '15+' | '16+' | '17+' | '18+' | '19+' | '20'>('all'); const [analysisResults, setAnalysisResults] = useState<{ vertical: GameAnalysis[]; horizontal: GameAnalysis[]; }>({ vertical: [], horizontal: [] }); const [isAnalyzing, setIsAnalyzing] = useState(false); const { latestResult, loading: apiLoading, error: apiError, fetchLatestResult, analyzeGameResult } = useLotomaniaAPI(); const getPrizeLabel = (points: number): string => { switch (points) { case 20: return 'PRÊMIO MÁXIMO! 🎉'; case 19: return 'Prêmio Alto 🏆'; case 18: return 'Prêmio Médio Alto 🥈'; case 17: return 'Prêmio Médio 🥉'; case 16: return 'Prêmio Baixo 🏅'; case 15: return 'Prêmio Mínimo 🎯'; case 0: return 'PRÊMIO MÁXIMO! 🎉'; // 0 acertos também premia default: return 'Sem prêmio'; } }; const performAnalysis = useCallback(async () => { if (!latestResult) return; setIsAnalyzing(true); try { // Analisar jogos verticais contra o último resultado const verticalAnalysis: GameAnalysis[] = []; verticalGames.forEach(game => { const gameNumbers = algorithm.getNumbersFromGame(game); const analysis = analyzeGameResult(gameNumbers, latestResult); verticalAnalysis.push({ game, result: latestResult, matches: analysis.matches, points: analysis.points, isWinning: analysis.isWinning, matchedNumbers: analysis.matchedNumbers, prize: getPrizeLabel(analysis.points) }); }); // Analisar jogos horizontais contra o último resultado const horizontalAnalysis: GameAnalysis[] = []; horizontalGames.forEach(game => { const gameNumbers = algorithm.getNumbersFromGame(game); const analysis = analyzeGameResult(gameNumbers, latestResult); horizontalAnalysis.push({ game, result: latestResult, matches: analysis.matches, points: analysis.points, isWinning: analysis.isWinning, matchedNumbers: analysis.matchedNumbers, prize: getPrizeLabel(analysis.points) }); }); setAnalysisResults({ vertical: verticalAnalysis, horizontal: horizontalAnalysis }); } catch (error) { console.error('Erro na análise:', error); } finally { setIsAnalyzing(false); } }, [latestResult, verticalGames, horizontalGames, algorithm, analyzeGameResult]); // Executar análise quando componente carrega ou quando resultado muda useEffect(() => { if (latestResult) { performAnalysis(); } }, [latestResult, performAnalysis]); const getFilteredAnalysis = (analysisData: GameAnalysis[]) => { let filtered = analysisData; // Filtrar por pontuação switch (analysisFilter) { case '20': filtered = filtered.filter(a => a.points === 20 || a.points === 0); break; case '19+': filtered = filtered.filter(a => a.points >= 19 || a.points === 0); break; case '18+': filtered = filtered.filter(a => a.points >= 18 || a.points === 0); break; case '17+': filtered = filtered.filter(a => a.points >= 17 || a.points === 0); break; case '16+': filtered = filtered.filter(a => a.points >= 16 || a.points === 0); break; case '15+': filtered = filtered.filter(a => a.points >= 15 || a.points === 0); break; default: // 'all' - não filtrar break; } return filtered; }; const renderStatistics = (analysisData: GameAnalysis[], type: 'vertical' | 'horizontal') => { const totalAnalyses = analysisData.length; const winningAnalyses = analysisData.filter(a => a.isWinning); const stats = { total: totalAnalyses, wins: winningAnalyses.length, winRate: totalAnalyses > 0 ? (winningAnalyses.length / totalAnalyses) * 100 : 0, points20: analysisData.filter(a => a.points === 20 || a.points === 0).length, points19: analysisData.filter(a => a.points === 19).length, points18: analysisData.filter(a => a.points === 18).length, points17: analysisData.filter(a => a.points === 17).length, points16: analysisData.filter(a => a.points === 16).length, points15: analysisData.filter(a => a.points === 15).length, averageMatches: totalAnalyses > 0 ? analysisData.reduce((sum, a) => sum + a.matches, 0) / totalAnalyses : 0 }; const chartData = { labels: ['15 pontos', '16 pontos', '17 pontos', '18 pontos', '19 pontos', '20 pontos'], datasets: [{ label: `Acertos ${type === 'vertical' ? 'Verticais' : 'Horizontais'}`, data: [stats.points15, stats.points16, stats.points17, stats.points18, stats.points19, stats.points20], backgroundColor: [ 'rgba(156, 163, 175, 0.8)', // 15 pontos - cinza 'rgba(34, 197, 94, 0.8)', // 16 pontos - verde 'rgba(59, 130, 246, 0.8)', // 17 pontos - azul 'rgba(245, 158, 11, 0.8)', // 18 pontos - amarelo 'rgba(239, 68, 68, 0.8)', // 19 pontos - vermelho 'rgba(147, 51, 234, 0.8)' // 20 pontos - roxo ], borderColor: [ 'rgb(156, 163, 175)', 'rgb(34, 197, 94)', 'rgb(59, 130, 246)', 'rgb(245, 158, 11)', 'rgb(239, 68, 68)', 'rgb(147, 51, 234)' ], borderWidth: 2 }] }; return (
{/* Cards de estatísticas */}

Total Analisado

{stats.total.toLocaleString()}

Premiações

{stats.wins}

{stats.winRate.toFixed(2)}%

Prêmios Máximos

{stats.points20}

20 ou 0 pontos

Média Acertos

{stats.averageMatches.toFixed(1)}

de 50 números

{/* Gráfico de distribuição */}

Distribuição de Prêmios

); }; const renderWinningGames = (analysisData: GameAnalysis[]) => { const winningGames = getFilteredAnalysis(analysisData).filter(a => a.isWinning); if (winningGames.length === 0) { return (

Nenhum jogo premiado encontrado com os filtros aplicados

); } return (
{winningGames.slice(0, 50).map((analysis, index) => (

Jogo {analysis.game.type === 'vertical' ? 'Vertical' : 'Horizontal'} #{analysis.game.id}

{analysis.points} pontos Concurso {analysis.result.concurso} • {analysis.result.data}
Posições marcadas:
{(analysis.game.type === 'vertical' ? analysis.game.markedColumns : analysis.game.markedRows! ).map(pos => ( {pos} ))}
Acertos: {analysis.matches}/50

{analysis.prize}

Fase {analysis.game.phase} • Ciclo {analysis.game.cycle}

Jogo {analysis.game.gameInPhase}

))} {winningGames.length > 50 && (

... e mais {winningGames.length - 50} jogos premiados

)}
); }; return (
{/* Header */}

Análise de Resultados

Comparação detalhada dos jogos com resultados oficiais da Lotomania

{/* Informações do resultado atual */}
{latestResult ? (

Último Resultado

Concurso #{latestResult.concurso}
{latestResult.data}

Filtro de análise:

Controles

{analysisResults.vertical.length > 0 && (
{analysisResults.vertical.length + analysisResults.horizontal.length} jogos analisados
)}
) : (

Carregando resultado mais recente da Lotomania...

)}
{/* Tabs */}
{/* Conteúdo baseado na tab ativa */} {apiError && (

{apiError}

)} {activeTab === 'vertical' && (
{renderStatistics(analysisResults.vertical, 'vertical')}

Jogos Verticais Premiados

{renderWinningGames(analysisResults.vertical)}
)} {activeTab === 'horizontal' && (
{renderStatistics(analysisResults.horizontal, 'horizontal')}

Jogos Horizontais Premiados

{renderWinningGames(analysisResults.horizontal)}
)} {activeTab === 'comparison' && (

Estatísticas Verticais

{renderStatistics(analysisResults.vertical, 'vertical')}

Estatísticas Horizontais

{renderStatistics(analysisResults.horizontal, 'horizontal')}
)}
); }; export default ResultsAnalysis;