#!/usr/bin/env python3
"""
🐴 JobScraper MultiSite - Raspador de Vagas Multi-Plataforma
=============================================================
Consolida vagas de emprego de múltiplos sites de tecnologia.
"""

import pandas as pd
from datetime import datetime
import os

# Imports dos scrapers
from scrapers.programathor_scraper import scrape_programathor
from scrapers.geekhunter_scraper import scrape_geekhunter

# Configuração: Sites a serem raspados
SITES = {
    'programathor': scrape_programathor,
    'geekhunter': scrape_geekhunter,
}

# Pasta de output
OUTPUT_DIR = 'output'


def ensure_output_dir():
    """Cria a pasta de output se não existir."""
    if not os.path.exists(OUTPUT_DIR):
        os.makedirs(OUTPUT_DIR)
        print(f"📁 Pasta '{OUTPUT_DIR}' criada.")


def run_scrapers(sites_to_run: list = None) -> pd.DataFrame:
    """
    Executa os scrapers configurados e consolida os resultados.
    
    Args:
        sites_to_run: Lista de sites para raspar. Se None, raspa todos.
    
    Returns:
        DataFrame consolidado com todas as vagas.
    """
    if sites_to_run is None:
        sites_to_run = list(SITES.keys())
    
    all_vagas = []
    
    print("=" * 60)
    print("🐴 JobScraper MultiSite - Iniciando raspagem...")
    print("=" * 60)
    
    for site_name in sites_to_run:
        if site_name not in SITES:
            print(f"⚠️  Site '{site_name}' não configurado. Pulando...")
            continue
        
        print(f"\n📡 Processando: {site_name.upper()}")
        print("-" * 40)
        
        scraper_func = SITES[site_name]
        df = scraper_func()
        
        if not df.empty:
            all_vagas.append(df)
    
    if all_vagas:
        consolidated_df = pd.concat(all_vagas, ignore_index=True)
        # Remover duplicatas baseado no link
        consolidated_df.drop_duplicates(subset=['link'], inplace=True)
        return consolidated_df
    
    return pd.DataFrame()


def save_results(df: pd.DataFrame, filename: str = None) -> str:
    """
    Salva o DataFrame consolidado em CSV.
    
    Args:
        df: DataFrame com as vagas.
        filename: Nome do arquivo (opcional).
    
    Returns:
        Caminho do arquivo salvo.
    """
    ensure_output_dir()
    
    if filename is None:
        timestamp = datetime.now().strftime('%Y%m%d_%H%M%S')
        filename = f'vagas_consolidadas_{timestamp}.csv'
    
    filepath = os.path.join(OUTPUT_DIR, filename)
    df.to_csv(filepath, index=False, encoding='utf-8-sig')
    
    return filepath


def main():
    """Função principal."""
    # Executar scrapers
    df = run_scrapers()
    
    print("\n" + "=" * 60)
    
    if df.empty:
        print("❌ Nenhuma vaga encontrada.")
        return
    
    # Estatísticas
    print(f"📊 Total de vagas coletadas: {len(df)}")
    print(f"📊 Fontes: {df['fonte'].value_counts().to_dict()}")
    
    # Salvar resultados
    filepath = save_results(df)
    print(f"\n💾 Vagas salvas em: {filepath}")
    
    # Também salvar versão "latest"
    latest_path = save_results(df, 'vagas_consolidadas.csv')
    print(f"💾 Versão atual: {latest_path}")
    
    print("=" * 60)
    print("✅ Raspagem concluída com sucesso!")
    
    # Preview
    print("\n📋 Preview das vagas:")
    print(df[['titulo', 'empresa', 'fonte']].head(10).to_string(index=False))


if __name__ == "__main__":
    main()
