import requests
import json
import time

# --- CONFIGURAÇÕES ---
# API Oficial do GBIF para Datasets
GBIF_API_URL = "https://api.gbif.org/v1/dataset"
TARGET_RECORDS = 50

# Parâmetros da busca (limit = quantidade, offset = paginação)
PARAMS = {
    "limit": TARGET_RECORDS,
    "offset": 0,
    # Você pode filtrar por tipo se quiser (ex: OCCURRENCE, CHECKLIST, METADATA)
    # Deixei sem filtro para pegar qualquer conjunto de dados recente.
}

HEADERS = {
    'User-Agent': 'Python-Research-Script/1.0 (Contact: researcher@university.edu)'
}

def coleta_gbif_completa():
    print(f"--- INICIANDO COLETA GBIF (API REST) ---")
    print(f"1. Conectando ao endpoint: {GBIF_API_URL}")
    print(f"   Solicitando os primeiros {TARGET_RECORDS} conjuntos de dados...")

    try:
        start_time = time.time()
        
        # A Mágica: O GBIF entrega tudo em um único pedido rápido
        response = requests.get(GBIF_API_URL, params=PARAMS, headers=HEADERS, timeout=30)
        
        if response.status_code != 200:
            print(f"ERRO FATAL: Servidor retornou código {response.status_code}")
            return

        # O JSON já vem pronto do servidor
        data = response.json()
        
        # A lista de datasets fica dentro da chave 'results'
        results = data.get('results', [])
        total_disponivel = data.get('count', 0)
        
        print(f"   [OK] Conexão estabelecida em {time.time() - start_time:.2f}s.")
        print(f"   Total de datasets disponíveis no GBIF: {total_disponivel}")
        print(f"2. Processando e salvando metadados...")

        datasets_processados = []
        count = 0

        for item in results:
            count += 1
            
            # Extração de campos principais para o log na tela
            gbif_key = item.get('key', 'Sem ID')
            title = item.get('title', 'Sem Título')
            publishing_org = item.get('publishingOrganizationKey', 'n/d')
            type_ds = item.get('type', 'n/d')
            
            # Montamos um objeto que guarda o metadado bruto original + identificadores
            dataset_final = {
                "gbif_uuid": gbif_key,
                "titulo": title,
                "tipo": type_ds,
                "link_portal": f"https://www.gbif.org/dataset/{gbif_key}",
                "api_endpoint": f"{GBIF_API_URL}/{gbif_key}",
                # AQUI ESTÁ A RIQUEZA: Todos os metadados brutos (Darwin Core/EML)
                "full_metadata": item 
            }
            
            datasets_processados.append(dataset_final)
            
            # Status visual (encurtamos o título para caber na tela)
            print(f"   [{count}/{TARGET_RECORDS}] Coletado: {title[:50]}... (Tipo: {type_ds})")

        # Salva o arquivo final
        nome_arquivo = "gbif_50_full_metadata.json"
        with open(nome_arquivo, "w", encoding="utf-8") as f:
            json.dump(datasets_processados, f, ensure_ascii=False, indent=2)

        print("\n" + "="*50)
        print(f"RELATÓRIO DE SUCESSO:")
        print(f" - Datasets coletados: {len(datasets_processados)}")
        print(f" - Arquivo gerado: {nome_arquivo}")
        print(f" - Tempo total: {time.time() - start_time:.2f} segundos")
        print("="*50)

    except Exception as e:
        print(f"\nERRO CRÍTICO: {e}")

if __name__ == "__main__":
    coleta_gbif_completa()