Loto / src /components /PrizeAnalysis.tsx
Raí Santos
oi
4c1e4ec
import React from 'react';
import { Trophy, DollarSign, TrendingUp, MapPin, Users, Calendar, Target } from 'lucide-react';
import { LotomaniaResult } from '../types';
interface PrizeAnalysisProps {
result: LotomaniaResult;
className?: string;
}
const PrizeAnalysis: React.FC<PrizeAnalysisProps> = ({ result, className = '' }) => {
// Formatação de valores monetários
const formatCurrency = (value: number): string => {
return new Intl.NumberFormat('pt-BR', {
style: 'currency',
currency: 'BRL',
minimumFractionDigits: 2
}).format(value);
};
// Formatação de números
const formatNumber = (value: number): string => {
return new Intl.NumberFormat('pt-BR').format(value);
};
// Calcular total de ganhadores
const totalGanhadores = result.premiacoes?.reduce((total, premio) => total + premio.ganhadores, 0) || 0;
// Calcular total de prêmios distribuídos
const totalPremios = result.premiacoes?.reduce((total, premio) => total + (premio.valorPremio * premio.ganhadores), 0) || 0;
// Verificar se houve ganhador principal (20 acertos)
const ganhadorPrincipal = result.premiacoes?.find(p => p.acertos === 20);
const temGanhadorPrincipal = ganhadorPrincipal && ganhadorPrincipal.ganhadores > 0;
return (
<div className={`bg-white rounded-2xl shadow-xl border border-gray-100 ${className}`}>
{/* Header */}
<div className="bg-gradient-to-r from-yellow-500 to-orange-500 text-white p-6 rounded-t-2xl">
<div className="flex items-center space-x-3">
<Trophy className="w-8 h-8" />
<div>
<h2 className="text-2xl font-bold">Análise de Prêmios</h2>
<p className="text-yellow-100">Concurso {result.concurso} - {result.data}</p>
</div>
</div>
</div>
<div className="p-6">
{/* Status do Concurso */}
<div className="grid grid-cols-1 md:grid-cols-3 gap-6 mb-8">
<div className="bg-gradient-to-br from-green-50 to-green-100 p-4 rounded-xl border border-green-200">
<div className="flex items-center space-x-3">
<DollarSign className="w-8 h-8 text-green-600" />
<div>
<p className="text-sm text-green-700 font-medium">Total Arrecadado</p>
<p className="text-2xl font-bold text-green-800">
{formatCurrency(result.valorArrecadado || 0)}
</p>
</div>
</div>
</div>
<div className={`p-4 rounded-xl border ${temGanhadorPrincipal
? 'bg-gradient-to-br from-blue-50 to-blue-100 border-blue-200'
: 'bg-gradient-to-br from-red-50 to-red-100 border-red-200'
}`}>
<div className="flex items-center space-x-3">
<Target className={`w-8 h-8 ${temGanhadorPrincipal ? 'text-blue-600' : 'text-red-600'}`} />
<div>
<p className={`text-sm font-medium ${temGanhadorPrincipal ? 'text-blue-700' : 'text-red-700'}`}>
Status do Prêmio Principal
</p>
<p className={`text-2xl font-bold ${temGanhadorPrincipal ? 'text-blue-800' : 'text-red-800'}`}>
{temGanhadorPrincipal ? '🎯 Ganho!' : '🔄 Acumulou'}
</p>
</div>
</div>
</div>
<div className="bg-gradient-to-br from-purple-50 to-purple-100 p-4 rounded-xl border border-purple-200">
<div className="flex items-center space-x-3">
<TrendingUp className="w-8 h-8 text-purple-600" />
<div>
<p className="text-sm text-purple-700 font-medium">Próximo Concurso</p>
<p className="text-2xl font-bold text-purple-800">
{formatCurrency(result.valorEstimadoProximoConcurso || 0)}
</p>
</div>
</div>
</div>
</div>
{/* Informações do Sorteio */}
<div className="bg-gray-50 rounded-xl p-4 mb-6">
<h3 className="text-lg font-semibold text-gray-800 mb-3 flex items-center">
<MapPin className="w-5 h-5 mr-2" />
Informações do Sorteio
</h3>
<div className="grid grid-cols-1 md:grid-cols-3 gap-4 text-sm">
<div>
<span className="font-medium text-gray-600">Local:</span>
<p className="text-gray-800">{result.localSorteio || 'Não informado'}</p>
</div>
<div>
<span className="font-medium text-gray-600">Próximo Concurso:</span>
<p className="text-gray-800">
{result.numeroProximoConcurso} - {result.dataProximoConcurso}
</p>
</div>
<div>
<span className="font-medium text-gray-600">Total de Ganhadores:</span>
<p className="text-gray-800 font-bold">{formatNumber(totalGanhadores)}</p>
</div>
</div>
</div>
{/* Tabela de Premiações */}
<div className="mb-6">
<h3 className="text-lg font-semibold text-gray-800 mb-4 flex items-center">
<Trophy className="w-5 h-5 mr-2 text-yellow-600" />
Premiações por Faixa
</h3>
<div className="overflow-x-auto">
<table className="w-full border-collapse bg-white rounded-lg overflow-hidden shadow-sm">
<thead>
<tr className="bg-gray-100">
<th className="text-left p-3 font-semibold text-gray-700">Faixa</th>
<th className="text-left p-3 font-semibold text-gray-700">Acertos</th>
<th className="text-center p-3 font-semibold text-gray-700">Ganhadores</th>
<th className="text-right p-3 font-semibold text-gray-700">Prêmio Individual</th>
<th className="text-right p-3 font-semibold text-gray-700">Total Pago</th>
</tr>
</thead>
<tbody>
{result.premiacoes?.map((premio, index) => {
const totalFaixa = premio.valorPremio * premio.ganhadores;
const isMainPrize = premio.acertos === 20;
const hasWinners = premio.ganhadores > 0;
return (
<tr
key={index}
className={`border-b border-gray-100 hover:bg-gray-50 transition-colors ${
isMainPrize ? 'bg-yellow-50' : ''
}`}
>
<td className="p-3">
<div className="flex items-center space-x-2">
{isMainPrize && <Trophy className="w-4 h-4 text-yellow-600" />}
<span className={`font-medium ${isMainPrize ? 'text-yellow-800' : 'text-gray-700'}`}>
{premio.faixa}ª
</span>
</div>
</td>
<td className="p-3">
<span className="bg-blue-100 text-blue-800 px-2 py-1 rounded-full text-sm font-medium">
{premio.acertos} acertos
</span>
</td>
<td className="p-3 text-center">
<span className={`font-bold ${hasWinners ? 'text-green-600' : 'text-gray-400'}`}>
{formatNumber(premio.ganhadores)}
</span>
</td>
<td className="p-3 text-right font-mono">
<span className={hasWinners ? 'text-green-600' : 'text-gray-400'}>
{formatCurrency(premio.valorPremio)}
</span>
</td>
<td className="p-3 text-right font-mono font-bold">
<span className={hasWinners ? 'text-green-700' : 'text-gray-400'}>
{formatCurrency(totalFaixa)}
</span>
</td>
</tr>
);
})}
</tbody>
<tfoot>
<tr className="bg-gray-50 font-bold">
<td colSpan={3} className="p-3 text-gray-700">TOTAL DISTRIBUÍDO</td>
<td className="p-3 text-right text-gray-700">-</td>
<td className="p-3 text-right text-green-700 font-mono text-lg">
{formatCurrency(totalPremios)}
</td>
</tr>
</tfoot>
</table>
</div>
</div>
{/* Ganhadores por Cidade */}
{result.ganhadores && result.ganhadores.length > 0 && (
<div>
<h3 className="text-lg font-semibold text-gray-800 mb-4 flex items-center">
<Users className="w-5 h-5 mr-2 text-blue-600" />
Ganhadores por Cidade
</h3>
<div className="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-4">
{result.ganhadores.map((ganhador, index) => (
<div key={index} className="bg-blue-50 border border-blue-200 rounded-lg p-4">
<div className="flex items-center justify-between">
<div>
<p className="font-semibold text-blue-800">
{ganhador.municipio}
</p>
<p className="text-sm text-blue-600">{ganhador.uf}</p>
</div>
<div className="text-right">
<p className="text-2xl font-bold text-blue-700">
{ganhador.ganhadores}
</p>
<p className="text-xs text-blue-600">
{ganhador.ganhadores === 1 ? 'ganhador' : 'ganhadores'}
</p>
</div>
</div>
</div>
))}
</div>
</div>
)}
{/* Estatísticas Adicionais */}
<div className="mt-6 grid grid-cols-2 md:grid-cols-4 gap-4">
<div className="bg-indigo-50 p-4 rounded-lg text-center">
<Calendar className="w-6 h-6 text-indigo-600 mx-auto mb-2" />
<p className="text-sm text-indigo-600 font-medium">Data do Sorteio</p>
<p className="text-lg font-bold text-indigo-800">{result.data}</p>
</div>
<div className="bg-green-50 p-4 rounded-lg text-center">
<DollarSign className="w-6 h-6 text-green-600 mx-auto mb-2" />
<p className="text-sm text-green-600 font-medium">% Distribuído</p>
<p className="text-lg font-bold text-green-800">
{result.valorArrecadado ? ((totalPremios / result.valorArrecadado) * 100).toFixed(1) : 0}%
</p>
</div>
<div className="bg-orange-50 p-4 rounded-lg text-center">
<TrendingUp className="w-6 h-6 text-orange-600 mx-auto mb-2" />
<p className="text-sm text-orange-600 font-medium">Acumulado</p>
<p className="text-lg font-bold text-orange-800">
{formatCurrency(result.valorAcumuladoProximoConcurso || 0)}
</p>
</div>
<div className="bg-purple-50 p-4 rounded-lg text-center">
<Users className="w-6 h-6 text-purple-600 mx-auto mb-2" />
<p className="text-sm text-purple-600 font-medium">Total Ganhadores</p>
<p className="text-lg font-bold text-purple-800">{formatNumber(totalGanhadores)}</p>
</div>
</div>
</div>
</div>
);
};
export default PrizeAnalysis;