public TrickleSmsAndEmailBetweenSetTimes MapToTrickleSmsAndEmailOverPeriod(Guid trickleId, string customerContactsId, CoordinatorSmsAndEmailModel model, string username)
        {
            var mapToTrickleSmsAndEmailOverPeriod = new TrickleSmsAndEmailBetweenSetTimes
            {
                ConfirmationEmails = new List <string> {
                    model.ConfirmationEmail
                },
                CoordinatorId = trickleId,
                MetaData      = new SmsMetaData {
                    Topic = model.Topic, Tags = model.GetTagList()
                },
                StartTimeUtc = DateTimeOlsenMapping.DateTimeWithOlsenZoneToUtc(model.StartTime, model.UserTimeZone),
                Duration     = model.SendAllBy.Value.Subtract(model.StartTime),
                EmailData    = new EmailData
                {
                    BodyHtml        = model.EmailHtmlContent,
                    FromAddress     = "*****@*****.**",     // TODO: Get from details from config??
                    BodyText        = string.Empty,
                    FromDisplayName = "Sam Jeffress Test",
                    ReplyToAddress  = "*****@*****.**",
                    Subject         = "test"
                },
                UserOlsenTimeZone = model.UserTimeZone,
                Username          = username,
                SmsAndEmailDataId = customerContactsId,
                SmsMessage        = model.SmsContent
            };

            return(mapToTrickleSmsAndEmailOverPeriod);
        }
//        public void Handle(TrickleSmsWithDefinedTimeBetweenEachMessage message)
//        {
//            Data.CoordinatorId = message.CoordinatorId == Guid.Empty ? Data.Id : message.CoordinatorId;
//            Data.OriginalScheduleStartTime = message.StartTimeUtc;
//            Data.EmailAddresses = message.ConfirmationEmails;
//            Data.UserOlsenTimeZone = message.UserOlsenTimeZone;
//            Data.Topic = message.MetaData.Topic;
//            var messageList = new List<ScheduleSmsForSendingLater>();
//            DateTime lastScheduledMessageTime = DateTime.Now;
//            for(int i = 0; i < message.Messages.Count; i++)
//            {
//                var extraTime = TimeSpan.FromTicks(message.TimeSpacing.Ticks*i);
//                lastScheduledMessageTime = message.StartTimeUtc.Add(extraTime);
//                var smsData = new SmsData(message.Messages[i].Mobile, message.Messages[i].Message);
//                var smsForSendingLater = new ScheduleSmsForSendingLater(message.StartTimeUtc.Add(extraTime), smsData, message.MetaData, Data.CoordinatorId, message.Username)
//                {
//                    CorrelationId = Data.CoordinatorId
//                };
//                messageList.Add(smsForSendingLater);
//            }
//            messageList.ForEach(m => Bus.Send(m));
//            //Bus.Send(messageList.ToArray());
//            var coordinatorCreated = new CoordinatorCreated
//            {
//                CoordinatorId = Data.CoordinatorId,
//                ScheduledMessages = messageList.Select(m => new MessageSchedule { Number = m.SmsData.Mobile, ScheduledTimeUtc = m.SendMessageAtUtc, ScheduleMessageId = m.ScheduleMessageId }).ToList(),
//                CreationDateUtc = DateTime.UtcNow,
//                MetaData = message.MetaData,
//                ConfirmationEmailAddresses = message.ConfirmationEmails,
//                UserOlsenTimeZone = message.UserOlsenTimeZone,
//                MessageBody = message.Messages.First().Message,
//                MessageCount = message.Messages.Count
//            };
//            Bus.Publish(coordinatorCreated);
//            Bus.SendLocal(new CoordinatorCreatedEmail(coordinatorCreated));
//            RequestUtcTimeout<CoordinatorTimeout>(lastScheduledMessageTime.AddMinutes(2));
//
//            RavenScheduleDocuments.SaveCoordinator(coordinatorCreated);
//            RavenScheduleDocuments.SaveSchedules(messageList, Data.CoordinatorId);
//        }

        public void Handle(TrickleSmsAndEmailBetweenSetTimes message)
        {
            Data.CoordinatorId             = message.CoordinatorId == Guid.Empty ? Data.Id : message.CoordinatorId;
            Data.OriginalScheduleStartTime = message.StartTimeUtc;
            Data.EmailAddresses            = message.ConfirmationEmails;
            Data.UserOlsenTimeZone         = message.UserOlsenTimeZone;
            Data.Topic    = message.MetaData.Topic;
            Data.Username = message.Username;
            var smsAndEmailCoordinatorData = RavenScheduleDocuments.GetSmsAndEmailCoordinatorData(message.SmsAndEmailDataId);

            if (smsAndEmailCoordinatorData == null)
            {
                throw new NotImplementedException("Need the data!");
            }
            var messageTiming            = TimingManager.CalculateTiming(message.StartTimeUtc, message.Duration, smsAndEmailCoordinatorData.CustomerContacts.Count);
            var lastScheduledMessageTime = DateTime.Now.AddTicks(message.Duration.Ticks);
            var messageList = new List <object>();
            var smsList     = new List <ScheduleSmsForSendingLater>();
            var emailList   = new List <ScheduleEmailForSendingLater>();

            for (int i = 0; i < smsAndEmailCoordinatorData.CustomerContacts.Count; i++)
            {
                if (smsAndEmailCoordinatorData.CustomerContacts[i].SmsCustomer())
                {
                    var smsData            = new SmsData(smsAndEmailCoordinatorData.CustomerContacts[i].MobileNumber, message.SmsMessage);
                    var smsForSendingLater = new ScheduleSmsForSendingLater(messageTiming[i], smsData, message.MetaData, Data.CoordinatorId, message.Username)
                    {
                        CorrelationId = Data.CoordinatorId
                    };
                    messageList.Add(smsForSendingLater);
                    smsList.Add(smsForSendingLater);
                }
                if (smsAndEmailCoordinatorData.CustomerContacts[i].EmailCustomer())
                {
                    var emailData            = new EmailData(message.EmailData, smsAndEmailCoordinatorData.CustomerContacts[i].EmailAddress);
                    var emailForSendingLater = new ScheduleEmailForSendingLater(messageTiming[i], emailData, message.MetaData, Data.CoordinatorId, message.Username)
                    {
                        CorrelationId = Data.CoordinatorId
                    };
                    messageList.Add(emailForSendingLater);
                    emailList.Add(emailForSendingLater);
                }
            }
            messageList.ForEach(m => Bus.Send("smsscheduler", m));
            var coordinatorCreated = new CoordinatorCreatedWithEmailAndSms
            {
                CoordinatorId              = Data.CoordinatorId,
                CreationDateUtc            = DateTime.UtcNow,
                MetaData                   = message.MetaData,
                ConfirmationEmailAddresses = message.ConfirmationEmails,
                UserOlsenTimeZone          = message.UserOlsenTimeZone,
                SmsMessage                 = message.SmsMessage,
                SmsCount                   = smsAndEmailCoordinatorData.CustomerContacts.Count(c => c.SmsCustomer()),
                EmailCount                 = smsAndEmailCoordinatorData.CustomerContacts.Count(c => c.EmailCustomer()),
                EmailData                  = message.EmailData,
                UserName                   = message.Username
            };

            RequestUtcTimeout <CoordinatorTimeout>(lastScheduledMessageTime.AddMinutes(2));
            Bus.Publish(coordinatorCreated);
            // TODO: Send email message
            //Bus.SendLocal(new CoordinatorCreatedEmail(coordinatorCreated));

            RavenScheduleDocuments.SaveCoordinator(coordinatorCreated);
            RavenScheduleDocuments.SaveSchedules(messageList, Data.CoordinatorId);
        }
 public TrickleSmsAndEmailBetweenSetTimes MapToTrickleSmsAndEmailOverPeriod(Guid trickleId, string customerContactsId, CoordinatorSmsAndEmailModel model, string username)
 {
     var mapToTrickleSmsAndEmailOverPeriod = new TrickleSmsAndEmailBetweenSetTimes
         {
             ConfirmationEmails = new List<string> {model.ConfirmationEmail },
             CoordinatorId = trickleId,
             MetaData = new SmsMetaData { Topic = model.Topic, Tags = model.GetTagList() },
             StartTimeUtc = DateTimeOlsenMapping.DateTimeWithOlsenZoneToUtc(model.StartTime, model.UserTimeZone),
             Duration = model.SendAllBy.Value.Subtract(model.StartTime),
             EmailData = new EmailData
                 {
                     BodyHtml = model.EmailHtmlContent,
                     FromAddress = "*****@*****.**", // TODO: Get from details from config??
                     BodyText = string.Empty,
                     FromDisplayName = "Sam Jeffress Test",
                     ReplyToAddress = "*****@*****.**",
                     Subject = "test"
                 },
             UserOlsenTimeZone = model.UserTimeZone,
             Username = username,
             SmsAndEmailDataId = customerContactsId,
             SmsMessage = model.SmsContent
         };
     return mapToTrickleSmsAndEmailOverPeriod;
 }