using System.Collections.Generic; using System.Threading.Tasks; using Sony.ChartBot.Entities; using Sony.ChartBot.Entities.MessengerApi; using Sony.ChartBot.Entities.Storage; using Sony.ChartBot.Messages.MessageBuilders; using Sony.ChartBot.MessengerApi; using Sony.ChartBot.Repository; namespace Sony.ChartBot.Messages.Helpers { public class MessageSender { private readonly MessengerApiClient _messengerApiClient; private readonly ConversationRepository _conversationRepository; public MessageSender(MessengerApiClient messengerApiClient, ConversationRepository conversationRepository) { _messengerApiClient = messengerApiClient; _conversationRepository = conversationRepository; } public async Task BuildAndSendMessagesAsync(MessagingData input, TData messageData, InquiryType inquiryType = InquiryType.AskForArtist, string trackReference = null, int? delayBetweenMessages = 100) where TBuilder : IMessageBuilder, new() { var messageBuilder = new TBuilder(); var messages = messageBuilder.BuildMessages(messageData); await SendMessagesAsync(input, messages, messageBuilder.ResponseType, inquiryType, trackReference, delayBetweenMessages); } public async Task BuildAndSendMessagesAsync(MessagingData input, InquiryType inquiryType = InquiryType.AskForArtist, string trackReference = null, int? delayBetweenMessages = 100) where TBuilder : IMessageBuilder, new() { var messageBuilder = new TBuilder(); var messages = messageBuilder.BuildMessages(); await SendMessagesAsync(input, messages, messageBuilder.ResponseType, inquiryType, trackReference, delayBetweenMessages); } private async Task SendMessagesAsync(MessagingData input, IEnumerable messages, ResponseType responseType, InquiryType inquiryType, string trackReference, int? delayBetweenMessages) { foreach (var message in messages) { await _messengerApiClient.SendMessageAsync(input.sender.id, message); await _conversationRepository.AddMessageToLogAsync(input, message, responseType, inquiryType, trackReference); if (delayBetweenMessages.HasValue) { await Task.Delay(delayBetweenMessages.Value); } } } public async Task SendInputParsingErrorResponseAsync(MessagingData data, string input, InvalidInputType invalidInputType) { switch (invalidInputType) { case InvalidInputType.Artist: await BuildAndSendMessagesAsync(data, input); break; case InvalidInputType.Country: await BuildAndSendMessagesAsync(data, input); break; } } } }