#!/usr/bin/env python3
"""
Extrator de Domínios .com.br
Extrai todos os domínios únicos .com.br de um arquivo de emails.
Otimizado para processar milhões de registros.
"""

import sys
import time

def extract_combr_domains(input_file: str, output_file: str = None) -> set:
    """
    Extrai domínios únicos .com.br de um arquivo de emails.

    Args:
        input_file: Caminho do arquivo de entrada (um email por linha)
        output_file: Caminho do arquivo de saída (opcional)

    Returns:
        Set com domínios únicos .com.br
    """
    domains = set()
    total_lines = 0
    combr_count = 0
    errors = 0

    print(f"\n📧 Processando: {input_file}")
    print("-" * 50)

    start_time = time.time()

    try:
        with open(input_file, 'r', encoding='utf-8', errors='ignore') as f:
            for line in f:
                total_lines += 1

                # Progresso a cada 500k linhas
                if total_lines % 500000 == 0:
                    elapsed = time.time() - start_time
                    rate = total_lines / elapsed
                    print(f"  ⏳ {total_lines:,} emails processados ({rate:,.0f}/s) - {len(domains):,} domínios únicos")

                line = line.strip().lower()

                if not line or '@' not in line:
                    continue

                try:
                    # Extrai domínio após @
                    parts = line.split('@')
                    if len(parts) >= 2:
                        domain = parts[-1].strip()

                        # Filtra apenas .com.br
                        if domain.endswith('.com.br'):
                            domains.add(domain)
                            combr_count += 1
                except Exception:
                    errors += 1
                    continue

    except FileNotFoundError:
        print(f"❌ Erro: Arquivo não encontrado: {input_file}")
        sys.exit(1)
    except Exception as e:
        print(f"❌ Erro ao ler arquivo: {e}")
        sys.exit(1)

    elapsed = time.time() - start_time

    # Estatísticas
    print("-" * 50)
    print(f"✅ Processamento concluído em {elapsed:.1f}s")
    print(f"   📊 Total de linhas: {total_lines:,}")
    print(f"   📧 Emails .com.br: {combr_count:,}")
    print(f"   🌐 Domínios únicos .com.br: {len(domains):,}")
    if errors > 0:
        print(f"   ⚠️  Linhas com erro: {errors:,}")

    # Salva resultado se output_file especificado
    if output_file:
        sorted_domains = sorted(domains)
        with open(output_file, 'w', encoding='utf-8') as f:
            for domain in sorted_domains:
                f.write(domain + '\n')
        print(f"\n💾 Resultado salvo em: {output_file}")

    return domains


def main():
    print("=" * 50)
    print("  EXTRATOR DE DOMÍNIOS .COM.BR")
    print("=" * 50)

    # Solicita caminho do arquivo
    if len(sys.argv) > 1:
        input_file = sys.argv[1]
    else:
        input_file = input("\n📁 Caminho do arquivo de emails: ").strip()

    if not input_file:
        print("❌ Caminho do arquivo não pode ser vazio")
        sys.exit(1)

    # Remove aspas se houver
    input_file = input_file.strip('"\'')

    # Define arquivo de saída
    output_file = input_file.rsplit('.', 1)[0] + '_dominios_combr.txt'

    # Executa extração
    domains = extract_combr_domains(input_file, output_file)

    # Mostra preview dos primeiros domínios
    if domains:
        print(f"\n📋 Preview (primeiros 20 domínios):")
        for domain in sorted(domains)[:20]:
            print(f"   • {domain}")
        if len(domains) > 20:
            print(f"   ... e mais {len(domains) - 20:,} domínios")

    print("\n" + "=" * 50)
    print("  CONCLUÍDO!")
    print("=" * 50 + "\n")


if __name__ == '__main__':
    main()
