import json

def zfill_if_short(value, size):
    s = str(value)
    return s.zfill(size)

def _aplicar_regras_em_objeto(obj):
    if not isinstance(obj, dict): return obj
    
    # Aplica a regra ao campo 'contrato'
    if "contrato" in obj: 
        obj["contrato"] = zfill_if_short(obj["contrato"], 15)
        
    # Aplica a regra ao campo 'ifConcessora.codigo'
    if "ifConcessora.codigo" in obj: 
        obj["ifConcessora.codigo"] = zfill_if_short(obj["ifConcessora.codigo"], 3)
        
    return obj

def aplicar_regras(dados):
    # Usamos json.loads(json.dumps(dados)) para criar uma cópia profunda
    # e não modificar os dados originais.
    novo = json.loads(json.dumps(dados)) 
    
    if isinstance(novo, list): 
        return [_aplicar_regras_em_objeto(item) for item in novo]
    else: 
        return _aplicar_regras_em_objeto(novo)

def calcular_correcoes(texto_atual):
    # Carrega o JSON a partir do texto
    dados = json.loads(texto_atual)
    
    # Aplica as regras para obter os dados corrigidos
    corrigido = aplicar_regras(dados)
    
    registros = []
    
    # Garante que ambos são listas para poder iterar
    lista_original = dados if isinstance(dados, list) else [dados]
    lista_corrigida = corrigido if isinstance(corrigido, list) else [corrigido]

    for i, (item_original, item_corrigido) in enumerate(zip(lista_original, lista_corrigida)):
        if not isinstance(item_original, dict): continue

        item_numero = i + 1

        # Compara o campo 'contrato'
        if "contrato" in item_original:
            antes = str(item_original.get("contrato", ""))
            depois = str(item_corrigido.get("contrato", ""))
            if antes != depois:
                registros.append({"item": item_numero, "campo": "Contrato", "antes": antes, "depois": depois})
        
        # Compara o campo 'ifConcessora.codigo'
        if "ifConcessora.codigo" in item_original:
            antes = str(item_original.get("ifConcessora.codigo", ""))
            depois = str(item_corrigido.get("ifConcessora.codigo", ""))
            if antes != depois:
                registros.append({"item": item_numero, "campo": "ifConcessora.codigo", "antes": antes, "depois": depois})
                
    # Retorna a lista de alterações, os dados originais e os dados corrigidos
    return registros, dados, corrigido