private async Task CallLuisPhoneNodeAsync(List <string> basket, IDialogContext context)
        {
            StringBuilder sb = new StringBuilder();  // Only works for debug
            IntentDecoder theDecoder;
            TopFeatures   topFeatures;
            Activity      reply = ((Activity)context.Activity).CreateReply("You can also at any stage ask for all phones and work through the different options on your own, just type \"Start Again\"");

            handSets.InitializeBag(basket);
            theDecoder  = new IntentDecoder(handSets, null, null, basket);
            topFeatures = new TopFeatures(theDecoder);
            if (debugMessages)
            {
                await context.PostAsync($"DEBUG : bag is beginning with {handSets.BagCount()}");
            }
            if (debugMessages)
            {
                await context.PostAsync("DEBUG : String Representation = " + handSets.BuildStrRep());
            }
            if (GetModelCount() == basket.Count)
            {
                await Miscellany.InsertDelayAsync(context);

                await context.PostAsync($"We have over {basket.Count} different models of phone to choose from.");

                await Miscellany.InsertDelayAsync(context);

                await context.PostAsync("As you are unsure what is your best model then let me know what is important to you and I'll select a few for you to choose from");

                await Miscellany.InsertDelayAsync(context);

                await context.PostAsync(" If you like a particular brand just say which ones.");

                await Miscellany.InsertDelayAsync(context);

                await context.PostAsync("Or you can choose features (like weight, battery life, camera...) or just tell me how you mostly use your phone (e.g. I like to play games on my iPhone, I regularly read books on my phone)");
            }
            else
            {
                await Miscellany.InsertDelayAsync(context);

                await context.PostAsync($"We have {basket.Count} phones which match your requirement.If you tell me what is important to you or how you use your phone then I can help you to pick the right one.");
            }
            reply.SuggestedActions = topFeatures.GetTop4Buttons(sb);
            if (debugMessages)
            {
                await context.PostAsync("DEBUG : Results " + sb.ToString());
            }
            await Miscellany.InsertDelayAsync(context);

            await context.PostAsync(reply);

            context.Call(new NodeLUISPhoneDialog(topFeatures, handSets, null, null, basket), LuisResponseHandlerAsync);
            LuisCalled = true;
        }
        private async Task UpdateUserAsync(IDialogContext context, int handSetsLeft, int handSetsB4)
        {
            StringBuilder sb = new StringBuilder("-->");
            string        acknowledgeMsg = decoder.LastOneWasNeed ? null : GetRightStringMsg(), aux;
            bool          removedSome = true;
            var           reply       = ((Activity)context.Activity).CreateReply("What else is important to refine it further?");

            if (CommonDialog.debugMessages)
            {
                await context.PostAsync($"DEBUG : Threshold = {decoder.Threshold}, desired intent = {desiredFeature}");

                await context.PostAsync("DEBUG : Ranking : \r\n");

                await context.PostAsync(sb.ToString() + "\r\n");
            }
            if (handSetsLeft == handSetsB4)
            {
                await Miscellany.InsertDelayAsync(context);

                await context.PostAsync("Unfortunately, that doesn't help in narrowing the list down");

                removedSome = false;
            }
            else if (handSetsLeft == 0)
            {
                await Miscellany.InsertDelayAsync(context);

                await context.PostAsync("I'm afraid that's a very high standard, I don't have any equipment that fulfills it.");

                removedSome  = false;
                handSetsLeft = handSetsB4;
            }
            if (handSetsLeft > BotConstants.MAX_CAROUSEL_CARDS)
            {
                if (CommonDialog.debugMessages)
                {
                    await context.PostAsync($"DEBUG : There are {handSetsLeft} on bag");
                }
                if (removedSome && (acknowledgeMsg != null))
                {
                    await Miscellany.InsertDelayAsync(context);

                    await context.PostAsync(acknowledgeMsg);
                }
                aux = removedSome ? "We have now" : "We still have";
                await Miscellany.InsertDelayAsync(context);

                await context.PostAsync($"{aux} {handSetsLeft} models that might be suitable for your needs. I could help short list further if you tell me what else is important for you");

                sb = new StringBuilder("");
                reply.SuggestedActions = topButtons.GetTop4Buttons(sb);
                await Miscellany.InsertDelayAsync(context);

                await context.PostAsync(reply);
            }
            else
            {
                if (CommonDialog.debugMessages)
                {
                    await context.PostAsync("We have just 5 left or fewer");
                }
                if (acknowledgeMsg != null)
                {
                    await Miscellany.InsertDelayAsync(context);

                    await context.PostAsync(acknowledgeMsg);
                }
                if ((!decoder.LastOneWasNeed) && (desiredFeature == EIntents.Brand))
                {
                    context.ConversationData.SetValue(BotConstants.SELECTED_BRANDS_KEY, decoder.StrKeyWords);
                }
                if (CommonDialog.debugMessages)
                {
                    await context.PostAsync($"DEBUG : Number of phones on bag : {handSetsBag.BagCount()}");
                }
                context.Done(decoder);
            }
        }
        private async Task RecommendPhoneAsync(IDialogContext context, string brand, DateTime?lowerThreshold = null)
        {
            int           count;
            TopFeatures   topFeatures;
            IntentDecoder theDecoder = new IntentDecoder(handSets, brand, lowerThreshold, null);

            StringBuilder sb = new StringBuilder("");   // For debugging purposes

            try
            {
                topFeatures = new TopFeatures(theDecoder);
                handSets.InitializeBag(brand, lowerThreshold);
                count = handSets.BagCount();
                if (count > BotConstants.MAX_CAROUSEL_CARDS)
                {
                    if (debugMessages)
                    {
                        if (debugMessages)
                        {
                            await context.PostAsync($"DEBUG : bag is beginning with {handSets.BagCount()}");
                        }
                    }
                    if (debugMessages)
                    {
                        await context.PostAsync("DEBUG : String Representation = " + handSets.BuildStrRep());
                    }
                    Activity message = (Activity)context.Activity;
                    Activity reply   = message.CreateReply(isUnsure ? "If you like a particular brand just say which one and I can display all the models available from that supplier in a carousel below" :
                                                           "Remember that you can always ask for all phones and work through the different options on your own,just enter \"Start Again\"");
                    reply.SuggestedActions = topFeatures.GetTop4Buttons(sb);
                    if (debugMessages)
                    {
                        await context.PostAsync("DEBUG : " + sb.ToString());
                    }
                    await Miscellany.InsertDelayAsync(context);

                    await context.PostAsync($"We have over { count} different models of phone to choose from. ");

                    if (isUnsure)
                    {
                        await Miscellany.InsertDelayAsync(context);

                        await context.PostAsync("As you are unsure what is your best model then let me know what is important to you and I'll select a few for you to choose from. If you like a particular brand just say which ones.");
                    }
                    await Miscellany.InsertDelayAsync(context);

                    await context.PostAsync("Or you can choose features (like weight, battery life, camera...) ");

                    await Miscellany.InsertDelayAsync(context);

                    await context.PostAsync("I can also recommend some models if you tell me how you mostly use your phone (e.g. I like to play games on my iPhone, I regularly read books on my phone)");

                    await Miscellany.InsertDelayAsync(context);

                    await context.PostAsync(reply);

                    context.Call(new NodeLUISPhoneDialog(topFeatures, handSets, brand, lowerThreshold, null), LuisResponseHandlerAsync);
                }
                else
                {
                    context.Call(new LessThan5Node(handSets.GetBagModels(), true), FinalSelectionReceivedAsync);
                }
            }
            catch (Exception xception)
            {
                if (debugMessages)
                {
                    await context.PostAsync("DEBUG : Message from the exception : " + xception.Message + "\r\nDEBUG : string builder : " + sb.ToString());
                }
            }
        }