import json
import pandas as pd

# Pesos baseados na Tabela de Mapeamento do seu manuscrito
PESOS = {
    "identificacao": 3.0,
    "taxonomia": 2.0,
    "estrutural": 1.5,
    "descritivo": 1.0
}

def calcular_penalidade(valor_destino, tipo_esperado="str"):
    """
    Simulação da lógica da tupla (S, T, C, V)
    Retorna o coeficiente de penalidade ci
    """
    if valor_destino is None or valor_destino == "" or valor_destino == []:
        return 1.0  # Perda Total (S)
    
    # Se o dado existe, aplicamos uma penalidade baseada na 'saúde' do campo
    # (No seu código real, aqui você validaria o Tipo e a Cardinalidade)
    return 0.1 # Valor de exemplo para dados preservados com pequena perda

def rodar_auditoria(nome_arquivo, chave_metadata, cenario, fonte):
    print(f"📊 Processando {fonte} - {cenario}...")
    try:
        with open(nome_arquivo, 'r', encoding='utf-8') as f:
            dados = json.load(f)
    except FileNotFoundError:
        print(f"⚠️ Arquivo {nome_arquivo} não encontrado na pasta.")
        return []
    
    resultados = []
    for item in dados:
        # Acessa o bloco de metadados correto
        meta = item.get(chave_metadata, {})
        if not meta and chave_metadata == "full_metadata": # Ajuste para GBIF
             meta = item.get("full_metadata", {})

        # Exemplo de cálculo simplificado para ID e Título
        # p1 (Identificação) e p2 (Descritivo)
        c1 = calcular_penalidade(meta.get("identifier") or meta.get("doi"))
        c2 = calcular_penalidade(meta.get("title") or meta.get("titulo"))
        
        # Fórmula: Lw = (p1*c1 + p2*c2) / (p1 + p2)
        lw = ((PESOS["identificacao"] * c1) + (PESOS["descritivo"] * c2)) / (PESOS["identificacao"] + PESOS["descritivo"])
        
        resultados.append({
            "ID": item.get("ufscar_id") or item.get("embrapa_id") or item.get("gbif_uuid"),
            "Fonte": fonte,
            "Cenário": cenario,
            "Lw (%)": round(lw * 100, 2)
        })
    return resultados

# --- EXECUÇÃO DOS CENÁRIOS ---
final = []

# 1. UFSCar - Cenário A (Dublin Core)
final.extend(rodar_auditoria("ufscar_50_full_metadata.json", "metadata_completo", "Cenário A", "UFSCar"))

# 2. Embrapa - Padrão Interno/Target (DataCite)
final.extend(rodar_auditoria("redape_embrapa_50_datacite.json", "metadata_datacite", "DataCite", "Embrapa"))

# 3. GBIF - Cenários B e C
final.extend(rodar_auditoria("gbif_50_full_metadata.json", "full_metadata", "Cenário B", "GBIF"))
final.extend(rodar_auditoria("gbif_50_full_metadata.json", "full_metadata", "Cenário C", "GBIF"))

# Gerar CSV final
df = pd.DataFrame(final)
df.to_csv("auditoria_3_repositorios.csv", index=False, sep=';')

print("\n✨ Auditoria Concluída!")
print(f"Total de registros processados: {len(df)}")
print("Arquivo gerado: auditoria_3_repositorios.csv")