private async Task SendOrScheduleAnnouncement(string type, IDialogContext context, Activity activity, TeamsChannelData channelData)
        {
            // Get all the details for announcement.
            var details = JsonConvert.DeserializeObject <AnnouncementActionDetails>(activity.Value.ToString());

            // Add announcemnet in DB.
            if (details == null || details.Id == null)
            {
                details = JsonConvert.DeserializeObject <TaskModule.BotFrameworkCardValue <AnnouncementActionDetails> >
                              (activity.Value.ToString()).Data;
            }
            var campaign = await Cache.Announcements.GetItemAsync(details.Id);

            if (campaign == null)
            {
                // Error: the annoucement was already sent
                await context.PostAsync("Unable to find this announcement. Please create new announcement.");

                return;
            }
            if (campaign.Status == Status.Sent)
            {
                // Error: no recipients
                await context.PostAsync("This announcement is already sent and can not be resent. Please create new announcement.");

                return;
            }
            else if (type == Constants.SendAnnouncement)
            {
                await context.PostAsync("Please wait while we send this announcement to all recipients.");
            }

            if (campaign.Recipients.Channels.Count == 0 && campaign.Recipients.Groups.Count == 0)
            {
                await context.PostAsync("No recipients. Please select at least one recipient.");

                return;
            }

            // Handle old records.
            if (string.IsNullOrEmpty(campaign.Recipients.TenantId))
            {
                campaign.Recipients.TenantId   = channelData.Tenant.Id;
                campaign.Recipients.ServiceUrl = activity.ServiceUrl;
            }

            // Send or schedule the announcement, depending on what the user clicked
            if (type == Constants.SendAnnouncement)
            {
                await SendAnnouncement(context, activity, channelData, campaign);
            }
            else
            {
                await ScheduleAnnouncement(context, activity, channelData, campaign);
            }

            var oldAnnouncementDetails = context.ConversationData.GetValueOrDefault <PreviewCardMessageDetails>(campaign.Id);

            if (oldAnnouncementDetails != null)
            {
                ConnectorClient connectorClient = new ConnectorClient(new Uri(activity.ServiceUrl));

                // Update card.
                var updateCard = campaign.GetPreviewCard().ToAttachment();

                var updateMessage = context.MakeMessage();

                updateMessage.Attachments.Add(CardHelper.GetCardToUpdatePreviewCard(updateCard,
                                                                                    $"Note: This announcement is { (type == Constants.SendAnnouncement ? "sent" : "scheduled") } successfully."));
                await connectorClient.Conversations.UpdateActivityAsync(activity.Conversation.Id, oldAnnouncementDetails.MessageCardId, (Activity)updateMessage);

                // Update action card.
                var message = type == Constants.SendAnnouncement ? "We have send this announcement successfully. Please create new announcement to send again." :
                              $"We have scheduled this announcement to be sent at {campaign.Schedule.ScheduledTime.ToString("MM/dd/yyyy hh:mm tt")}. Note that announcements scheduled for past date will be sent immediately.";

                var updateAnnouncement = CardHelper.GetUpdateMessageCard(message);
                updateMessage = context.MakeMessage();
                updateMessage.Attachments.Add(updateAnnouncement);
                await connectorClient.Conversations.UpdateActivityAsync(activity.Conversation.Id, oldAnnouncementDetails.MessageActionId, (Activity)updateMessage);

                context.ConversationData.RemoveValue(campaign.Id);
            }
            else if (type == Constants.ScheduleAnnouncement)
            {
                var message = $"We have re-scheduled the announcement to be sent at {campaign.Schedule.ScheduledTime.ToString("MM/dd/yyyy hh:mm tt")}.";
                await context.PostAsync(message);

                var reply = activity.CreateReply();
                reply.Attachments.Add(CardHelper.GetAnnouncementBasicDetails(campaign));

                await context.PostAsync(reply);
            }
        }