/// <summary>
        /// TaskModuleFetch.
        /// </summary>
        /// <param name="turnContext">turnContext.</param>
        /// <param name="taskModuleRequest">taskmoduleRequest.</param>
        /// <param name="cancellationToken">cancellationToken.</param>
        /// <returns>returns task.</returns>
        protected override async Task <TaskModuleResponse> OnTeamsTaskModuleFetchAsync(ITurnContext <IInvokeActivity> turnContext, TaskModuleRequest taskModuleRequest, CancellationToken cancellationToken)
        {
            try
            {
                var activityFetch = (Activity)turnContext.Activity;
                if (activityFetch.Value == null)
                {
                    throw new ArgumentException("activity's value should not be null");
                }

                ScrumDetails scrumMemberDetails = JsonConvert.DeserializeObject <ScrumDetails>(JObject.Parse(activityFetch.Value.ToString())["data"].ToString());
                string       membersId          = scrumMemberDetails.MembersActivityIdMap;
                string       activityIdval      = this.GetActivityIdToMatch(membersId, turnContext.Activity.From.Id);

                // A user is added during a running scrum and tries to update his/her details.
                if (activityIdval == null)
                {
                    return(new TaskModuleResponse
                    {
                        Task = new TaskModuleContinueResponse
                        {
                            Value = new TaskModuleTaskInfo()
                            {
                                Card = ScrumCards.NoActionScrumCard(),
                                Height = "small",
                                Width = "medium",
                                Title = Resources.NoActiveScrumTitle,
                            },
                        },
                    });
                }
                else
                {
                    return(new TaskModuleResponse
                    {
                        Task = new TaskModuleContinueResponse
                        {
                            Value = new TaskModuleTaskInfo()
                            {
                                Card = ScrumCards.ScrumCard(membersId),
                                Height = "large",
                                Width = "medium",
                                Title = Resources.ScrumTaskModuleTitle,
                            },
                        },
                    });
                }
            }
            catch (Exception ex)
            {
                this.telemetryClient.TrackTrace($"Invoke Activity failed: {ex.Message}");
                this.telemetryClient.TrackException(ex);
                return(null);
            }
        }
        private async Task HandleReportGeneration(ITurnContext <IMessageActivity> turnContext, CancellationToken cancellationToken)
        {
            string conversationId = GetConversationId(turnContext);
            var    activityFetch  = (Activity)turnContext.Activity;

            if (activityFetch.Value == null)
            {
                throw new ArgumentException("activity's value should not be null");
            }

            var startDate     = JObject.Parse(activityFetch.Value.ToString())["start_date"].ToString();
            var endDate       = JObject.Parse(activityFetch.Value.ToString())["end_date"].ToString();
            var startDateTime = new DateTimeOffset(DateTime.ParseExact(
                                                       startDate,
                                                       "yyyy-MM-dd",
                                                       CultureInfo.InvariantCulture));
            var endDateTime = new DateTimeOffset(DateTime.ParseExact(
                                                     endDate,
                                                     "yyyy-MM-dd",
                                                     CultureInfo.InvariantCulture));

            endDateTime = endDateTime.AddDays(1);
            Directory.GetCurrentDirectory();
            List <ScrumDetailsEntity> entities = await this.scrumProvider.GetOrderedScrumUpdatesAsync(conversationId, startDateTime, endDateTime);

            if (entities.Count == 0)
            {
                await turnContext.SendActivityAsync($"Hi {turnContext.Activity.From.Name}, No updates found for specified time range", cancellationToken : cancellationToken);

                return;
            }
            var signedReportUri = await this.reportProvider.SaveReportAndGetUri(entities, conversationId, startDateTime, endDateTime);

            var reportActivity = MessageFactory.Attachment(ScrumCards.GetReportLinkCard(turnContext, startDateTime, endDateTime, signedReportUri));

            reportActivity.Conversation = turnContext.Activity.Conversation;
            await turnContext.SendActivityAsync(reportActivity, cancellationToken : cancellationToken);
        }
        protected override async Task OnMessageActivityAsync(ITurnContext <IMessageActivity> turnContext, CancellationToken cancellationToken)
        {
            try
            {
                await this.SendTypingIndicatorAsync(turnContext);

                var    conversationType = turnContext.Activity.Conversation.ConversationType;
                string conversationId   = GetConversationId(turnContext);

                if (string.Compare(conversationType, "channel", StringComparison.OrdinalIgnoreCase) == 0 ||
                    string.Compare(conversationType, "groupChat", StringComparison.OrdinalIgnoreCase) == 0)
                {
                    if (turnContext.Activity.Type.Equals(ActivityTypes.Message))
                    {
                        turnContext.Activity.RemoveRecipientMention();
                        if (turnContext.Activity.Text == null)
                        {
                            await this.HandleReportGeneration(turnContext, cancellationToken);

                            return;
                        }

                        switch (turnContext.Activity.Text.Trim().ToLower())
                        {
                        case Constants.GetReport:
                            await this.HandleReportGeneration(turnContext, cancellationToken);

                            break;

                        case Constants.Report:
                            this.telemetryClient.TrackTrace($"scrum {conversationId} requesting report by {turnContext.Activity.From.Id}");
                            var reportActivity = MessageFactory.Attachment(ScrumCards.ScrumReportCard(turnContext));
                            reportActivity.Conversation = turnContext.Activity.Conversation;
                            await turnContext.SendActivityAsync(reportActivity, cancellationToken);

                            break;

                        case Constants.Start:
                            this.telemetryClient.TrackTrace($"scrum {conversationId} started by {turnContext.Activity.From.Id}");

                            var scrum = await this.scrumProvider.GetScrumAsync(conversationId);

                            if (scrum != null && scrum.IsScrumRunning)
                            {
                                // check if member in scrum exists.
                                // A user is added during a running scrum and tries to start a new scrum.
                                var activityId = this.GetActivityIdToMatch(scrum.MembersActivityIdMap, turnContext.Activity.From.Id);
                                if (activityId == null)
                                {
                                    await turnContext.SendActivityAsync(string.Format(Resources.NoPartOfScrumStartText, turnContext.Activity.From.Name));

                                    this.telemetryClient.TrackTrace($"Member who is updating the scrum is not the part of scrum for : {conversationId}");
                                }
                                else
                                {
                                    this.telemetryClient.TrackTrace($"Scrum is already running for conversation id {conversationId}");
                                    await turnContext.SendActivityAsync(Resources.RunningScrumMessage);
                                }
                            }
                            else
                            {
                                // start a new scrum
                                this.telemetryClient.TrackTrace($"Scrum start for : {conversationId}");
                                await this.StartScrumAsync(turnContext, cancellationToken);
                            }

                            break;

                        case Constants.TakeATour:
                            var tourCards = TourCard.GetTourCards(this.configuration["AppBaseURL"]);
                            await turnContext.SendActivityAsync(MessageFactory.Carousel(tourCards));

                            break;

                        case Constants.CompleteScrum:
                            var scrumInfo = await this.scrumProvider.GetScrumAsync(conversationId);

                            if (scrumInfo.IsScrumRunning)
                            {
                                var activityId = this.GetActivityIdToMatch(scrumInfo.MembersActivityIdMap, turnContext.Activity.From.Id);

                                // check if member in scrum exists.
                                // A user is added during a running scrum and tries to complete the running scrum.
                                if (activityId == null)
                                {
                                    await turnContext.SendActivityAsync(string.Format(Resources.NoPartOfCompleteScrumText, turnContext.Activity.From.Name));

                                    this.telemetryClient.TrackTrace($"Member who is updating the scrum is not the part of scrum for : {conversationId}");
                                }
                                else
                                {
                                    var cardId   = scrumInfo.ScrumStartActivityId;
                                    var activity = MessageFactory.Attachment(ScrumCompleteCard.GetScrumCompleteCard());
                                    activity.Id           = cardId;
                                    activity.Conversation = turnContext.Activity.Conversation;
                                    await turnContext.UpdateActivityAsync(activity, cancellationToken);

                                    // Update the trail card
                                    var    dateString       = string.Format("{{{{TIME({0})}}}}", DateTime.UtcNow.ToString("yyyy'-'MM'-'dd'T'HH':'mm':'ss'Z'"));
                                    string cardTrailMessage = string.Format(Resources.ScrumCompletedByText, turnContext.Activity.From.Name, dateString);
                                    await this.UpdateTrailCard(cardTrailMessage, turnContext, cancellationToken);

                                    scrumInfo.IsScrumRunning       = false;
                                    scrumInfo.ThreadConversationId = conversationId;
                                    var savedData = await this.scrumProvider.SaveOrUpdateScrumAsync(scrumInfo);

                                    if (!savedData)
                                    {
                                        await turnContext.SendActivityAsync(Resources.ErrorMessage);

                                        return;
                                    }

                                    this.telemetryClient.TrackTrace($"Scrum completed by: {turnContext.Activity.From.Name} for {conversationId}");
                                }
                            }
                            else
                            {
                                await turnContext.SendActivityAsync(Resources.CompleteScrumErrorText);
                            }

                            break;

                        default:
                            await turnContext.SendActivityAsync(MessageFactory.Attachment(HelpCard.GetHelpCard()), cancellationToken);

                            break;
                        }
                    }
                }
                else
                {
                    await turnContext.SendActivityAsync(Resources.ScopeErrorMessage);
                }
            }
            catch (Exception ex)
            {
                this.telemetryClient.TrackTrace($"For {turnContext.Activity.Conversation.Id} : Message Activity failed: {ex.Message}");
                this.telemetryClient.TrackException(ex);
            }
        }