#!/usr/bin/env python3
# -*- coding: utf-8 -*-

"""
Script para fazer scraping dos resultados do Jogo do Bicho
Extrai resultados de todos os horários da página portalbrasil.net
Estrutura HTML: <h3> com título e <p> abaixo com resultados
"""

import requests
from bs4 import BeautifulSoup
import re
from datetime import datetime
import json

def extrair_resultados():
    """
    Faz scraping da página e extrai todos os resultados do jogo do bicho
    """
    url = 'https://portalbrasil.net/jogodobicho/resultado-do-jogo-do-bicho/'
    
    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36'
    }
    
    try:
        print(f"🔄 Fazendo requisição para: {url}")
        response = requests.get(url, headers=headers, timeout=30)
        response.raise_for_status()
        response.encoding = 'utf-8'
        
        print("✅ HTML baixado com sucesso!")
        print("🔍 Analisando conteúdo...")
        
        soup = BeautifulSoup(response.text, 'html.parser')
        
        resultados = []
        
        # Padrão para encontrar títulos de horários no h3
        # Exemplo: "Resultado do Jogo do Bicho de Hoje das 09h00 – PPT"
        pattern_horario = re.compile(r'Resultado do Jogo do Bicho.*?das\s+(\d{2})h00.*?[–-]\s*(\w+)', re.IGNORECASE)
        
        # Padrão para encontrar resultados: "1º ► 6102-01 — AVESTRUZ"
        padrao_resultado = re.compile(r'(\d+)º\s*[►➤]\s*([\d-]+)\s*[—–-]\s*([A-ZÁÉÍÓÚÇÃÕÊÔ\s]+)', re.IGNORECASE)
        
        # Encontrar todos os h3 que contêm o título do horário
        for h3 in soup.find_all('h3'):
            texto_h3 = h3.get_text(strip=True)
            
            # Verificar se é um título de horário
            match_horario = pattern_horario.search(texto_h3)
            
            if match_horario:
                hora = match_horario.group(1)
                tipo_sorteio = match_horario.group(2)
                
                print(f"\n📅 Encontrado: {hora}h00 - {tipo_sorteio}")
                
                # Procurar a tag <p> logo após este h3
                resultados_horario = []
                proximo_p = h3.find_next_sibling('p')
                
                # Se não encontrar <p> imediatamente, procurar nos próximos elementos
                if not proximo_p:
                    # Procurar em qualquer elemento próximo
                    elemento_atual = h3.find_next_sibling()
                    while elemento_atual:
                        if elemento_atual.name == 'p':
                            proximo_p = elemento_atual
                            break
                        elemento_atual = elemento_atual.find_next_sibling()
                
                if proximo_p:
                    texto_p = proximo_p.get_text(strip=True)
                    
                    # Verificar se há mensagem de "não há extrações"
                    if 'não há extrações' in texto_p.lower() or 'não há extrações de hoje' in texto_p.lower():
                        print(f"   ⚠️  Não há extrações para este horário")
                        resultados.append({
                            'hora': hora,
                            'tipo_sorteio': tipo_sorteio,
                            'resultados': []
                        })
                        continue
                    
                    # Procurar todos os resultados neste parágrafo
                    matches = padrao_resultado.findall(texto_p)
                    
                    for match in matches:
                        lugar = int(match[0])
                        numero = match[1].strip()
                        animal = match[2].strip()
                        
                        resultados_horario.append({
                            'lugar': lugar,
                            'numero': numero,
                            'animal': animal
                        })
                    
                    # Se não encontrou no primeiro <p>, procurar nos próximos <p>
                    if len(resultados_horario) < 7:
                        proximo_p = proximo_p.find_next_sibling('p')
                        while proximo_p and len(resultados_horario) < 7:
                            texto_p = proximo_p.get_text(strip=True)
                            
                            # Verificar se é um novo horário (tem outro h3 antes)
                            h3_anterior = proximo_p.find_previous('h3')
                            if h3_anterior and h3_anterior != h3:
                                # Encontrou outro h3, então para aqui
                                break
                            
                            matches = padrao_resultado.findall(texto_p)
                            for match in matches:
                                lugar = int(match[0])
                                numero = match[1].strip()
                                animal = match[2].strip()
                                
                                # Evitar duplicatas
                                if not any(r['lugar'] == lugar and r['numero'] == numero for r in resultados_horario):
                                    resultados_horario.append({
                                        'lugar': lugar,
                                        'numero': numero,
                                        'animal': animal
                                    })
                            
                            proximo_p = proximo_p.find_next_sibling('p')
                    
                    # Ordenar por lugar
                    resultados_horario.sort(key=lambda x: x['lugar'])
                
                if len(resultados_horario) > 0:
                    print(f"   ✅ Encontrados {len(resultados_horario)} resultados")
                    resultados.append({
                        'hora': hora,
                        'tipo_sorteio': tipo_sorteio,
                        'resultados': resultados_horario
                    })
                else:
                    print(f"   ⚠️  Nenhum resultado encontrado para este horário")
                    # Mesmo sem resultados, adiciona para manter consistência
                    resultados.append({
                        'hora': hora,
                        'tipo_sorteio': tipo_sorteio,
                        'resultados': []
                    })
        
        return resultados
        
    except requests.exceptions.RequestException as e:
        print(f"❌ Erro ao fazer requisição: {e}")
        return None
    except Exception as e:
        print(f"❌ Erro ao processar HTML: {e}")
        import traceback
        traceback.print_exc()
        return None

def formatar_resultados(resultados):
    """
    Formata os resultados para exibição
    """
    if not resultados:
        return "Nenhum resultado encontrado."
    
    output = []
    data_atual = datetime.now().strftime('%Y-%m-%d')
    
    for item in resultados:
        hora = item['hora']
        tipo = item['tipo_sorteio']
        resultados_lista = item['resultados']
        
        output.append(f"\n{'='*60}")
        output.append(f"Resultado do Jogo do Bicho de Hoje das {hora}h00 – {tipo}")
        output.append(f"Data: {data_atual}")
        output.append(f"{'='*60}")
        
        if len(resultados_lista) == 0:
            output.append("** Não há extrações de hoje para exibir! **")
        else:
            for resultado in resultados_lista:
                output.append(f"{resultado['lugar']}º ► {resultado['numero']} — {resultado['animal']}")
    
    return "\n".join(output)

def salvar_json(resultados, arquivo='bicho_resultados.json'):
    """
    Salva os resultados em formato JSON
    """
    if not resultados:
        return False
    
    data_atual = datetime.now().strftime('%Y-%m-%d')
    
    dados = {
        'data': data_atual,
        'timestamp': datetime.now().isoformat(),
        'resultados': resultados
    }
    
    try:
        with open(arquivo, 'w', encoding='utf-8') as f:
            json.dump(dados, f, ensure_ascii=False, indent=2)
        print(f"\n💾 Resultados salvos em: {arquivo}")
        return True
    except Exception as e:
        print(f"❌ Erro ao salvar JSON: {e}")
        return False

def main():
    """
    Função principal
    """
    print("="*60)
    print("🎲 Scraper de Resultados do Jogo do Bicho")
    print("="*60)
    
    resultados = extrair_resultados()
    
    if resultados:
        print("\n" + "="*60)
        print("📊 RESULTADOS EXTRAÍDOS:")
        print("="*60)
        print(formatar_resultados(resultados))
        
        # Salvar em JSON
        salvar_json(resultados)
        
        # Retornar resultados para uso em outros scripts
        return resultados
    else:
        print("\n❌ Não foi possível extrair os resultados.")
        return None

if __name__ == '__main__':
    main()
