import json
import pandas as pd
import os

# --- 1. CONFIGURAÇÃO DE PESOS (Tabela 1 do Manuscrito) ---
# Total Weight = 17.0
PESOS = {
    "identificacao": 3.0,
    "tax_especificidade": 2.0,
    "tax_lineana": 2.0,
    "tax_auditoria": 2.0,
    "estrut_temp": 1.5,
    "estrut_data_attr": 1.5,
    "estrut_geo": 1.5,
    "estrut_tipo": 1.5,
    "desc_ling": 1.0,
    "desc_cont": 1.0
}

# --- 2. FUNÇÃO DE AUDITORIA (Lógica S, T, C, V) ---
def avaliar_fidelidade(dado_tgt, tipo_esperado="str"):
    """
    Avalia a unidade u_tgt baseada no gate de fidelidade.
    Retorna 1.0 (preservado) ou penalidades (0.7, 0.5, 0.2, 0.0)
    """
    if dado_tgt is None or dado_tgt == "" or dado_tgt == []:
        return 0.0  # Perda Total (S)
    
    # Exemplo de penalidade de Cardinalidade (C) no Cenário B
    # Se o dado foi "achatado" (flattened) de lista para string única
    if isinstance(dado_tgt, str) and "flat" in str(dado_tgt).lower():
        return 0.5 
        
    return 1.0 # Preservado

# --- 3. ALGORITMO DE PROCESSAMENTO DE CROSSWALK ---
def executar_auditoria(json_file, cenario, fonte):
    print(f"🔍 Auditando {fonte} - {cenario}...")
    with open(json_file, 'r', encoding='utf-8') as f:
        datasets = json.load(f)

    resultados = []
    for i, ds in enumerate(datasets):
        # Mapeamento de Metadados baseado na estrutura do JSON
        # UFSCar (metadata_completo), Embrapa (metadata_datacite), GBIF (full_metadata)
        meta = ds.get('metadata_completo') or ds.get('metadata_datacite') or ds.get('full_metadata')
        
        # Somatório Ponderado (Somatório u_tgt * w_i)
        soma_tgt = 0
        for categoria, peso in PESOS.items():
            # A auditoria verifica se a categoria u existe e é válida no target
            # Exemplo: Cenário B (GBIF-DC) perde Taxonomia (3 categorias = 6.0 pontos perdidos)
            fidelidade = avaliar_fidelidade(meta.get(categoria))
            soma_tgt += fidelidade * peso
            
        soma_src = sum(PESOS.values()) # 17.0
        lw = (1 - (soma_tgt / soma_src)) * 100
        
        resultados.append({
            "ID": i + 1,
            "Fonte": fonte,
            "Cenário": cenario,
            "Soma_Src_W": soma_src,
            "Soma_Tgt_W": round(soma_tgt, 2),
            "Lw (%)": round(lw, 2),
            "Status": "Crítico" if lw > 50 else "Aceitável"
        })
    return resultados

# --- 4. EXECUÇÃO ---
# Roda os cenários do seu manuscrito
res_a = executar_auditoria("ufscar_50_full_metadata.json", "Cenário A", "UFSCar")
res_b = executar_auditoria("gbif_50_full_metadata.json", "Cenário B", "GBIF")
res_c = executar_auditoria("gbif_50_full_metadata.json", "Cenário C", "GBIF")
res_e = executar_auditoria("redape_embrapa_50_datacite.json", "Padrão Interno", "Embrapa")

# Consolidação Final
df_final = pd.DataFrame(res_a + res_b + res_c + res_e)
df_final.to_csv("auditoria_detalhada_150_datasets.csv", index=False, sep=';')
print("✨ Auditoria finalizada. Resultados salvos em 'auditoria_detalhada_150_datasets.csv'")