#!/usr/bin/env python3
"""
Google Search Scraper
Busca uma palavra-chave no Google e retorna os resultados
"""

import requests
from bs4 import BeautifulSoup
import sys
import json
from urllib.parse import quote_plus

def scrape_google(query, num_results=10):
    """
    Faz scraping do Google para uma palavra-chave específica

    Args:
        query (str): Palavra ou frase para buscar
        num_results (int): Número de resultados desejados

    Returns:
        list: Lista de dicionários com título, link e descrição
    """

    # Headers para simular um navegador real
    headers = {
        'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36',
        'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8',
        'Accept-Language': 'pt-BR,pt;q=0.9,en-US;q=0.8,en;q=0.7',
        'Accept-Encoding': 'gzip, deflate, br',
        'Connection': 'keep-alive',
        'Upgrade-Insecure-Requests': '1'
    }

    # Encode da query para URL
    encoded_query = quote_plus(query)

    # URL do Google Search
    url = f'https://www.google.com/search?q={encoded_query}&num={num_results}'

    print(f"🔍 Buscando: {query}")
    print(f"📡 URL: {url}\n")

    try:
        # Fazer requisição
        response = requests.get(url, headers=headers, timeout=10)
        response.raise_for_status()

        # Parse HTML
        soup = BeautifulSoup(response.text, 'html.parser')

        # Encontrar resultados de busca
        results = []

        # Google usa divs com classe 'g' para resultados orgânicos
        search_results = soup.find_all('div', class_='g')

        for idx, result in enumerate(search_results[:num_results], 1):
            try:
                # Extrair título
                title_elem = result.find('h3')
                title = title_elem.get_text() if title_elem else 'N/A'

                # Extrair link
                link_elem = result.find('a')
                link = link_elem.get('href') if link_elem else 'N/A'

                # Extrair descrição/snippet
                desc_elem = result.find('div', class_=['VwiC3b', 'yXK7lf'])
                description = desc_elem.get_text() if desc_elem else 'N/A'

                results.append({
                    'position': idx,
                    'title': title,
                    'link': link,
                    'description': description
                })

            except Exception as e:
                print(f"⚠️  Erro ao processar resultado {idx}: {e}")
                continue

        return results

    except requests.exceptions.RequestException as e:
        print(f"❌ Erro na requisição: {e}")
        return []
    except Exception as e:
        print(f"❌ Erro inesperado: {e}")
        return []

def print_results(results):
    """Imprime os resultados de forma formatada"""

    if not results:
        print("❌ Nenhum resultado encontrado")
        return

    print(f"✅ Encontrados {len(results)} resultados:\n")
    print("=" * 80)

    for result in results:
        print(f"\n#{result['position']} - {result['title']}")
        print(f"🔗 {result['link']}")
        print(f"📝 {result['description'][:150]}..." if len(result['description']) > 150 else f"📝 {result['description']}")
        print("-" * 80)

def save_to_json(results, filename='google_results.json'):
    """Salva resultados em arquivo JSON"""
    try:
        with open(filename, 'w', encoding='utf-8') as f:
            json.dump(results, f, ensure_ascii=False, indent=2)
        print(f"\n💾 Resultados salvos em: {filename}")
    except Exception as e:
        print(f"❌ Erro ao salvar arquivo: {e}")

def main():
    """Função principal"""

    print("=" * 80)
    print("🔍 GOOGLE SEARCH SCRAPER")
    print("=" * 80 + "\n")

    # Verificar argumentos da linha de comando
    if len(sys.argv) > 1:
        query = ' '.join(sys.argv[1:])
    else:
        # Solicitar palavra-chave
        query = input("Digite a palavra ou frase para buscar: ").strip()

        if not query:
            print("❌ Palavra-chave não pode estar vazia")
            sys.exit(1)

    # Solicitar número de resultados
    try:
        num = input("Quantos resultados deseja (padrão 10)? ").strip()
        num_results = int(num) if num else 10
    except ValueError:
        num_results = 10

    # Fazer scraping
    results = scrape_google(query, num_results)

    # Exibir resultados
    print_results(results)

    # Perguntar se deseja salvar
    if results:
        save = input("\n💾 Deseja salvar os resultados em JSON? (s/n): ").strip().lower()
        if save == 's':
            filename = input("Nome do arquivo (padrão: google_results.json): ").strip()
            filename = filename if filename else 'google_results.json'
            save_to_json(results, filename)

    print("\n✅ Concluído!")

if __name__ == '__main__':
    main()
