def etapa_confirmar_escolha_cadastro(ctx: dict, mensagem: str) -> dict:
    """Processa a escolha do cliente (número do cadastro ou do plano)"""

    # ============================================
    # FUNÇÃO AUXILIAR LOCAL
    # ============================================    
    def listar_planos_para_escolha(planos: list) -> dict:
        """Lista os planos para o cliente escolher"""
        resposta = "Encontrei vários planos ativos neste cadastro. Escolha qual deseja usar:\n\n"
        for i, plano in enumerate(planos, 1):
            nome_plano = plano.get("plano", "Plano")
            endereco = plano.get("endereco_instalacao", "Endereço não informado")
            vencimento = plano.get("dia_vencimento", "?")
            resposta += f"{i} - *{nome_plano}*\n   Endereço: {endereco}\n   Vencimento: dia {vencimento}\n\n"
        resposta += "Digite o número do plano."
        return {"resposta": resposta, "aguardando_escolha_plano": True}

    import re
    
    msg_lower = mensagem.lower().strip()
    
    # ============================================
    # CASO 1: Aguardando escolha de PLANO (múltiplos planos)
    # ============================================
    if ctx.get("aguardando_escolha_plano"):
        try:
            escolha = int(mensagem.strip())
            planos = ctx.get("planos_para_escolha", [])
            
            if 1 <= escolha <= len(planos):
                plano = planos[escolha - 1]
                # CORREÇÃO: usar plano_escolhido_id em vez de id_cliente_plano
                ctx["plano_escolhido_id"] = plano.get("id_cliente_plano")
                log(f"[ETAPA_CONFIRMAR] plano_escolhido_id salvo: {ctx['plano_escolhido_id']}", "INFO")
                ctx["aguardando_escolha_plano"] = False
                ctx.pop("planos_para_escolha", None)
                log(f"[ETAPA_CONFIRMAR] Plano escolhido: {ctx['plano_escolhido_id']}", "INFO")
                return etapa_exibir_contatos(ctx)
            else:
                return {"resposta": f"Opção inválida. Escolha entre 1 e {len(planos)}."}
        except ValueError:
            return {"resposta": "Digite apenas o número do plano."}
    
    # ============================================
    # CASO 2: Aguardando confirmação SIM/NÃO do cadastro único
    # ============================================
    if ctx.get("aguardando_confirmacao"):
        if msg_lower in ["sim", "s", "yes", "y"]:
            ctx["aguardando_confirmacao"] = False
            
            # Tenta usar planos já salvos no contexto (preferencial)
            planos_ativos = ctx.get("planos_ativos_temp")
            if not planos_ativos:
                # Fallback: buscar do primeiro cadastro
                cadastros = ctx.get("ultima_consulta_cpf", [])
                if cadastros:
                    cad = cadastros[0]
                    planos_ativos = filtrar_planos_ativos(cad.get("planos", []))
                    ctx["planos_ativos_temp"] = planos_ativos
            
            if not planos_ativos:
                return {"resposta": "Não encontrei planos ativos neste cadastro. Deseja falar com um atendente?"}
            
            if len(planos_ativos) == 1:
                # CORREÇÃO: usar plano_escolhido_id
                ctx["plano_escolhido_id"] = planos_ativos[0].get("id_cliente_plano")
                log(f"[ETAPA_CONFIRMAR] Plano único salvo: {ctx['plano_escolhido_id']}", "INFO")
                return etapa_exibir_contatos(ctx)
            else:
                ctx["planos_para_escolha"] = planos_ativos
                ctx["aguardando_escolha_plano"] = True
                return listar_planos_para_escolha(planos_ativos)
                
        elif msg_lower in ["nao", "não", "n", "no"]:
            ctx["aguardando_confirmacao"] = False
            ctx.pop("cpf_cliente", None)
            ctx.pop("ultima_consulta_cpf", None)
            ctx.pop("planos_ativos_temp", None)
            return {"resposta": "Por favor, informe o CPF correto ou diga 'não sou cliente'."}
        else:
            return {"resposta": "Responda SIM se este é seu cadastro ou NÃO para informar outro CPF."}
    
    # ============================================
    # CASO 3: Aguardando escolha de CADASTRO (múltiplos cadastros)
    # ============================================
    if ctx.get("aguardando_escolha"):
        try:
            escolha = int(mensagem.strip())
            cadastros = ctx.get("ultima_consulta_cpf", [])
            
            if 1 <= escolha <= len(cadastros):
                cad = cadastros[escolha - 1]
                ctx["id_cliente"] = cad.get("id_cliente")
                ctx["aguardando_escolha"] = False
                log(f"[ETAPA_CONFIRMAR] Cadastro escolhido: ID {ctx['id_cliente']}", "INFO")
                
                # Buscar planos ativos do cadastro escolhido
                planos_ativos = filtrar_planos_ativos(cad.get("planos", []))
                ctx["planos_ativos_temp"] = planos_ativos
                
                if len(planos_ativos) == 1:
                    # CORREÇÃO: usar plano_escolhido_id
                    ctx["plano_escolhido_id"] = planos_ativos[0].get("id_cliente_plano")
                    log(f"[ETAPA_CONFIRMAR] Plano único salvo: {ctx['plano_escolhido_id']}", "INFO")
                    return etapa_exibir_contatos(ctx)
                elif len(planos_ativos) > 1:
                    ctx["planos_para_escolha"] = planos_ativos
                    ctx["aguardando_escolha_plano"] = True
                    return listar_planos_para_escolha(planos_ativos)
                else:
                    return {"resposta": "Não encontrei planos ativos neste cadastro. Deseja falar com um atendente?"}
            else:
                return {"resposta": f"Opção inválida. Escolha um número entre 1 e {len(cadastros)}."}
        except ValueError:
            return {"resposta": "Digite apenas o número do cadastro."}
    
    # Fallback (não deveria ocorrer)
    return etapa_exibir_contatos(ctx)