public async Task <MatchedMessage> ProcessAsync(string username, AnalysisResult result, string input)
        {
            input = TransformCommandToInput(input);

            List <Tweet> messages = _memoryCache.Get(MESSAGES_TAG) as List <Tweet>;

            if (messages == null)
            {
                messages = await _twitterRepository
                           .GetTweetContentAsync();

                _memoryCache.Add(MESSAGES_TAG, messages, DateTimeOffset.UtcNow.AddHours(1));
            }

            MatchedMessage matchedMessage = ProcessGreetingsMessage(messages, username, result, input);

            if (matchedMessage == null)
            {
                matchedMessage = await PredictWithLUIS(messages, username, input);
            }

            if (matchedMessage == null)
            {
                matchedMessage = ProcessDefaultMessage(messages, username, result, input);
            }

            return(matchedMessage);
        }
        MatchedMessage ProcessGreetingsMessage(List <Tweet> messages, string username, AnalysisResult result, string input)
        {
            MatchedMessage messageResult = null;

            var filteredMessages = messages
                                   .Where(i => i.Text.StartsWith("Hola @") &&
                                          !i.IsReply);

            if (input.ToUpperInvariant().Contains("HOLA ") ||
                input.ToUpperInvariant().Contains("HOLA,") ||
                input.ToUpperInvariant().StartsWith("HOLA"))
            {
                var random = new Random();

                var message = filteredMessages.ElementAt(random.Next(0, filteredMessages.Count() - 1));

                messageResult = new MatchedMessage
                {
                    Message   = ReplaceUsername(message.Text, username),
                    Sentiment = message.Sentiment
                };
            }

            return(messageResult);
        }
        MatchedMessage ProcessLUISMessage(List <Tweet> messages, string username, LuisResult res)
        {
            MatchedMessage result         = null;
            var            topScoreIntent = res.TopScoringIntent;
            var            topicToSearch  = string.Empty;
            var            verbWord       = string.Empty;

            var filteredMessages = messages
                                   .Where(i => !i.Text.Contains("Hola @"));

            topicToSearch = string.Join(" ", res.Entities.SelectMany(i => i.Value).OrderBy(i => i.Score).Select(i => i.Value));

            switch (topScoreIntent.Name)
            {
            case "ConocesA":
            {
                verbWord = "conozco";
                break;
            }

            case "QueOpinas":
            {
                verbWord = "opino";
                break;
            }

            case "CualEs":
            {
                verbWord = "es";
                break;
            }

            case "QuienEs":
            {
                verbWord = "es";
                break;
            }

            case "TeGusta":
            {
                verbWord = "gusta";
                break;
            }

            case "EresUnBot":
            {
                verbWord      = "es un";
                topicToSearch = "submarinismo";
                break;
            }
            }

            if (!string.IsNullOrWhiteSpace(verbWord) && topScoreIntent.Score > 0.5d)
            {
                var selectedMessages = filteredMessages
                                       .Where(i => i.Text.ToUpperInvariant().Split(' ', ',', '.', ':', '-').Contains(topicToSearch.ToUpperInvariant()))
                                       .ToList();

                var random = new Random();

                if (selectedMessages.Any())
                {
                    var predefinedPhrase = selectedMessages.ElementAt(random.Next(0, selectedMessages.Count()));
                    var phrasesWithVerb  = selectedMessages.Where(i => i.Text.ToUpperInvariant().Contains(verbWord)).ToList();

                    if (phrasesWithVerb.Any())
                    {
                        predefinedPhrase = phrasesWithVerb.ElementAt(random.Next(0, phrasesWithVerb.Count()));
                    }

                    result = new MatchedMessage
                    {
                        Message   = ReplaceUsername(predefinedPhrase.Text, username),
                        Sentiment = predefinedPhrase.Sentiment
                    };
                }
                else
                {
                    selectedMessages = filteredMessages
                                       .Where(i => i.Text.ToUpperInvariant().Contains(verbWord.ToUpperInvariant()))
                                       .ToList();

                    if (selectedMessages.Any() &&
                        !string.IsNullOrWhiteSpace(topicToSearch))
                    {
                        var predefinedPhrase = selectedMessages.ElementAt(random.Next(0, selectedMessages.Count()));

                        result = new MatchedMessage
                        {
                            Message   = ReplaceUsername(predefinedPhrase.Text, username),
                            Sentiment = predefinedPhrase.Sentiment
                        };
                    }
                }
            }

            return(result);
        }