private static async Task <StockLUIS> GetEntityFromLUIS(string Query)
        {
            Query = Uri.EscapeDataString(Query);
            StockLUIS Data = new StockLUIS();

            using (HttpClient client = new HttpClient())
            {
                string RequestURI = "https://api.projectoxford.ai/luis/v2.0/apps/4795ab7b-b2b9-413a-8e2b-92505c976e3f?subscription-key=f6ea8956f36b4379bcab23f342bfb460&q=" + Query
                                    + "&verbose=true";

                HttpResponseMessage msg = await client.GetAsync(RequestURI);

                if (msg.IsSuccessStatusCode)
                {
                    var JsonDataResponse = await msg.Content.ReadAsStringAsync();

                    Data = JsonConvert.DeserializeObject <StockLUIS>(JsonDataResponse);
                }
            }
            return(Data);
        }
        /// <summary>
        /// POST: api/Messages
        /// Receive a message from a user and reply to it
        /// </summary>
        public async Task <HttpResponseMessage> Post([FromBody] Activity activity)
        {
            if (activity.Type == ActivityTypes.Message)
            {
                ConnectorClient connector   = new ConnectorClient(new Uri(activity.ServiceUrl));
                StateClient     stateClient = activity.GetStateClient();
                BotData         userData    = await stateClient.BotState.GetUserDataAsync(activity.ChannelId, activity.From.Id);

                var      userMessage = activity.Text;
                Activity reply;

                reply      = activity.CreateReply();
                reply.Type = ActivityTypes.Typing;
                reply.Text = null;
                await connector.Conversations.ReplyToActivityAsync(reply);

                string StockRateString;
                StLUIS = await GetEntityFromLUIS(activity.Text);

                if (StLUIS.intents.Count() > 0)
                {
                    switch (StLUIS.intents[0].intent)
                    {
                    // users asks for stock price of particular stock.
                    case "StockPrice":
                        favOn = false;
                        await Conversation.SendAsync(activity, () => new StockCards());

                        break;

                    // user asks for converting particular currency.
                    case "ConvertCurrency":
                        await Conversation.SendAsync(activity, () => new CurrencyCard());

                        break;

                    // user wants to set a particular stock as their favourite.
                    case "SetAsFavourite":
                        string favStock = StLUIS.entities[0].entity;
                        userData.SetProperty <string>("FavStock", favStock);
                        await stateClient.BotState.SetUserDataAsync(activity.ChannelId, activity.From.Id, userData);

                        StockRateString = favStock + " has been set as your favourite stock.\nYou can call it by simply typing 'favourite stock' or similar.\nReset your favourite by typing 'Clear favourite stock' or similar.";
                        reply           = activity.CreateReply(StockRateString);
                        await connector.Conversations.ReplyToActivityAsync(reply);

                        favOn = true;
                        break;

                    // users wants to get their favourite stock.
                    case "GetFavourite":
                        string fStock = userData.GetProperty <string>("FavStock");
                        if (fStock == null)
                        {
                            StockRateString = "You have not assigned any stock as favourite.";
                            reply           = activity.CreateReply(StockRateString);
                            await connector.Conversations.ReplyToActivityAsync(reply);
                        }
                        else
                        {
                            favOn = true;
                            StockCards.favStock = fStock;
                            await Conversation.SendAsync(activity, () => new StockCards());
                        }
                        break;

                    // users wants to clear favourite stock.
                    case "ClearFavourite":
                        await stateClient.BotState.DeleteStateForUserAsync(activity.ChannelId, activity.From.Id);

                        StockRateString = "Your favourite stock has been cleared.";
                        reply           = activity.CreateReply(StockRateString);
                        await connector.Conversations.ReplyToActivityAsync(reply);

                        favOn = false;
                        break;

                    // user wants to see list of lost/ stolen cards.
                    case "SeeLost":
                        List <Timeline> timelines = await AzureManager.AzureManagerInstance.GetTimelines();

                        StockRateString = "";
                        foreach (Timeline t in timelines)
                        {
                            if (t.CardNumber != 0)
                            {
                                StockRateString += "Card Number: [" + t.CardNumber + "]   STATUS: " + t.Status + ",   Time Reported: " + t.LostTime + "\n\n";
                            }
                        }
                        reply = activity.CreateReply(StockRateString);
                        await connector.Conversations.ReplyToActivityAsync(reply);

                        break;

                    // user wants to report a lost/ stolen card.
                    case "ReportCard":
                        int    cardNo = 0;
                        String status = "";
                        for (int i = 0; i < 2; i++)
                        {
                            if (StLUIS.entities[i].type.Equals("statusOfCard"))
                            {
                                status = StLUIS.entities[i].entity;
                            }
                            else
                            {
                                cardNo = int.Parse(StLUIS.entities[i].entity);
                            }
                        }
                        Timeline timeline = new Timeline()
                        {
                            CardNumber = cardNo,
                            Status     = StLUIS.entities[0].entity,
                            LostTime   = DateTime.Now + ""
                        };

                        await AzureManager.AzureManagerInstance.AddTimeline(timeline);

                        StockRateString = "Your report for " + timeline.Status + " card ( ID: " + timeline.CardNumber + " ) has been registered.";
                        reply           = activity.CreateReply(StockRateString);
                        await connector.Conversations.ReplyToActivityAsync(reply);

                        break;

                    // user wants to mark a card as found.
                    case "MarkFound":
                        List <Timeline> tlines = await AzureManager.AzureManagerInstance.GetTimelines();

                        StockRateString = "";
                        foreach (Timeline t in tlines)
                        {
                            if (t.CardNumber != 0)
                            {
                                if (int.Parse(StLUIS.entities[0].entity).Equals(t.CardNumber))
                                {
                                    await AzureManager.AzureManagerInstance.RemoveTimeline(t);

                                    break;
                                }
                            }
                        }
                        reply = activity.CreateReply(StLUIS.entities[0].entity + " has been marked as found.");
                        await connector.Conversations.ReplyToActivityAsync(reply);

                        break;
                    // user wants to update an entry they made. (?)

                    // user wants to get Help
                    case "GetHelp":
                        await Conversation.SendAsync(activity, () => new StockCards());

                        break;

                    // user wants to do something that is not supported or understood.
                    default:
                        StockRateString = "Sorry, I'm not sure I understand.";
                        reply           = activity.CreateReply(StockRateString);
                        await connector.Conversations.ReplyToActivityAsync(reply);

                        break;
                    }
                }
                else
                {
                    StockRateString = "Sorry, I'm not sure I understand.";
                    reply           = activity.CreateReply(StockRateString);
                    await connector.Conversations.ReplyToActivityAsync(reply);
                }
            }
            else
            {
                HandleSystemMessage(activity);
            }
            var response = Request.CreateResponse(HttpStatusCode.OK);

            return(response);
        }