def etapa_consultar_cadastros(ctx: dict, cpf: str) -> dict:
    """Consulta CPF e retorna lista de cadastros com endereço e quantidade de planos"""
    
    import re
    
    cpf_limpo = re.sub(r'\D', '', cpf)
    log(f"[ETAPA_CONSULTAR] Consultando CPF: {cpf_limpo}", "DEBUG")
    
    resultado = chamar_api_radiusnet("consultar_cliente_por_cpf", cpf=cpf_limpo)
    
    log(f"[ETAPA_CONSULTAR] Resultado API: success={resultado.get('success')}", "DEBUG")
    
    if not resultado.get("success"):
        return {"resposta": f"Não foi possível consultar seu CPF. {resultado.get('error', 'Tente novamente.')}"}
    
    cadastros = resultado.get("data", [])
    
    # Filtrar apenas status Ativo, Avisado, Bloqueado (ignorar Arquivado)
    cadastros_validos = []
    for c in cadastros:
        status = c.get("status_cliente")
        if status in ["Ativo", "Avisado", "Bloqueado"]:
            cadastros_validos.append(c)
    
    log(f"[ETAPA_CONSULTAR] Cadastros válidos: {len(cadastros_validos)}", "DEBUG")
    
    if not cadastros_validos:
        return {"resposta": "Não encontrei cadastros ativos com este CPF. Deseja falar com um atendente?"}
    
    ctx["ultima_consulta_cpf"] = cadastros_validos
    
    # ============================================
    # CASO 1: Apenas um cadastro
    # ============================================
    if len(cadastros_validos) == 1:
        cad = cadastros_validos[0]
        ctx["id_cliente"] = cad.get("id_cliente")
        
        # Buscar planos ativos
        planos_ativos = filtrar_planos_ativos(cad.get("planos", []))
        qtd_planos = len(planos_ativos)
        
        # Guardar planos ativos no contexto para uso posterior
        ctx["planos_ativos_temp"] = planos_ativos
        
        # Montar resumo do cadastro
        nome = cad.get("nome_razao", "Cliente")
        status = cad.get("status_cliente", "Desconhecido")
        # Buscar endereço do primeiro plano
        endereco = "Endereço não informado"
        for p in planos_ativos:
            if p.get("endereco_instalacao"):
                endereco = p.get("endereco_instalacao")
                break
        
        resposta = f"📋 *Dados do cadastro encontrado:*\n\n"
        resposta += f"👤 Nome: {nome}\n"
        resposta += f"📌 Status: {status}\n"
        resposta += f"📍 Endereço: {endereco}\n"
        resposta += f"📡 Planos ativos: {qtd_planos}\n"
        
        # Se houver apenas 1 plano, já exibe o resumo do plano
        if qtd_planos == 1:
            plano = planos_ativos[0]
            nome_plano = plano.get("plano", "Plano")
            endereco_plano = plano.get("endereco_instalacao", "Endereço não informado")
            vencimento = plano.get("dia_vencimento", "?")
            resposta += f"\n📡 *Plano:* {nome_plano}\n"
            resposta += f"📍 Endereço de instalação: {endereco_plano}\n"
            resposta += f"📅 Vencimento: dia {vencimento}\n"
        
        resposta += "\n---\n*Este é o seu cadastro correto? (responda SIM ou NÃO)*"
        
        ctx["aguardando_confirmacao"] = True
        return {"resposta": resposta}
    
    # ============================================
    # CASO 2: Múltiplos cadastros
    # ============================================
    resposta = "Encontrei vários cadastros com este CPF. Escolha um:\n\n"
    for i, cad in enumerate(cadastros_validos, 1):
        nome = cad.get("nome_razao", "Cliente")
        status = cad.get("status_cliente")
        
        # Buscar endereço do primeiro plano
        planos = cad.get("planos", [])
        endereco = "Endereço não informado"
        for p in planos:
            if p.get("endereco_instalacao"):
                endereco = p.get("endereco_instalacao")
                break
        
        # Contar planos ativos
        planos_ativos = filtrar_planos_ativos(planos)
        qtd_planos = len(planos_ativos)
        
        resposta += f"{i} - *{nome}* - Status: {status}\n"
        resposta += f"   Endereço: {endereco}\n"
        resposta += f"   Planos ativos: {qtd_planos}\n\n"
    
    resposta += "Digite o número do cadastro correto."
    return {"resposta": resposta, "aguardando_escolha": True, "total_opcoes": len(cadastros_validos)}