public ActionResult Resume(FormCollection collection)
        {
            var coordinatorid = collection["CoordinatorId"];
            var timeToResume = DateTime.Now;
            var timeToResumeParsed = DateTime.TryParse(collection["timeToResume"], out timeToResume);
            var userTimeZone = collection["UserTimeZone"];
            var finishTime = DateTime.Now;
            var finishTimeParsed = DateTime.TryParse(collection["finishTime"], out finishTime);

            // validate
            if (!timeToResumeParsed)
                ModelState.AddModelError("timeToResume", "Time to resume must be set");
            if (timeToResume < DateTime.Now.AddMinutes(-5))
                ModelState.AddModelError("timeToResume", "Time to resume must be in the future");
            if (finishTimeParsed && finishTime <= timeToResume)
                ModelState.AddModelError("finishTime", "Finish time must be after time to resume");

            if (!ModelState.IsValid)
            {
                using (var session = RavenDocStore.GetStore().OpenSession())
                {
                    var coordinatorSummary = session.Query<ScheduledMessagesStatusCountInCoordinatorIndex.ReduceResult, ScheduledMessagesStatusCountInCoordinatorIndex>()
                        .Where(s => s.CoordinatorId == coordinatorid)
                        .ToList();
                    var coordinatorTrackingData = session.Load<CoordinatorTrackingData>(coordinatorid);
                    if (coordinatorTrackingData == null)
                    {
                        return View("DetailsNotCreated", model: coordinatorid);
                    }

                    if (HttpContext.Session != null && HttpContext.Session["CoordinatorState_" + coordinatorid] != null && HttpContext.Session["CoordinatorState_" + coordinatorid] is CoordinatorStatusTracking)
                        coordinatorTrackingData.CurrentStatus = (CoordinatorStatusTracking)HttpContext.Session["CoordinatorState_" + coordinatorid];
                    ViewData.Add("timeToResume", collection["timeToResume"]);
                    ViewData.Add("finishTime", collection["finishTime"]);
                    var overview = new CoordinatorOverview(coordinatorTrackingData, coordinatorSummary);
                    return View("Details3", overview);
                }
            }

            var dateTimeToResumeUtc = DateTimeOlsenMapping.DateTimeWithOlsenZoneToUtc(timeToResume, userTimeZone);
            if (finishTimeParsed)
            {
                var dateTimeToFinishUtc = DateTimeOlsenMapping.DateTimeWithOlsenZoneToUtc(finishTime, userTimeZone);
                Bus.Send(new RescheduleTrickledMessages { CoordinatorId = Guid.Parse(coordinatorid), ResumeTimeUtc = dateTimeToResumeUtc, FinishTimeUtc = dateTimeToFinishUtc, MessageRequestTimeUtc = DateTime.UtcNow });
            }
            else
            {
                Bus.Send(new ResumeTrickledMessages { CoordinatorId = Guid.Parse(coordinatorid), ResumeTimeUtc = dateTimeToResumeUtc, MessageRequestTimeUtc = DateTime.UtcNow });
            }

            HttpContext.Session.Add("CoordinatorState_" + coordinatorid, CoordinatorStatusTracking.Started);
            return RedirectToAction("Details", new { coordinatorid });
        }
        public ActionResult Details(string coordinatorid)
        {
            using (var session = RavenDocStore.GetStore().OpenSession())
            {
                var coordinatorSummary = session.Query<ScheduledMessagesStatusCountInCoordinatorIndex.ReduceResult, ScheduledMessagesStatusCountInCoordinatorIndex>()
                    .Where(s => s.CoordinatorId == coordinatorid)
                    .ToList();
                var coordinatorTrackingData = session.Load<CoordinatorTrackingData>(coordinatorid);
                if (coordinatorSummary.Count == 0 || coordinatorTrackingData == null)
                {
                    return View("DetailsNotCreated", model: coordinatorid);
                }

                DateTime? nextSmsDateUtc = session.Query<ScheduleTrackingData, ScheduleMessagesInCoordinatorIndex>()
                    .Where(s => s.CoordinatorId == Guid.Parse(coordinatorid) && s.MessageStatus == MessageStatus.Scheduled)
                    .OrderBy(s => s.ScheduleTimeUtc)
                    .Select(s => s.ScheduleTimeUtc)
                    .FirstOrDefault();
                if (nextSmsDateUtc == DateTime.MinValue)
                    nextSmsDateUtc = null;

                DateTime? finalSmsDateUtc = session.Query<ScheduleTrackingData, ScheduleMessagesInCoordinatorIndex>()
                    .Where(s => s.CoordinatorId== Guid.Parse(coordinatorid) && s.MessageStatus == MessageStatus.Scheduled)
                    .OrderByDescending(s => s.ScheduleTimeUtc)
                    .Select(s => s.ScheduleTimeUtc)
                    .FirstOrDefault();
                if (finalSmsDateUtc == DateTime.MinValue)
                    finalSmsDateUtc = null;

                var overview = new CoordinatorOverview(coordinatorTrackingData, coordinatorSummary);
                overview.NextScheduledMessageDate = nextSmsDateUtc;
                overview.FinalScheduledMessageDate = finalSmsDateUtc;
                if (HttpContext.Session != null && HttpContext.Session["CoordinatorState_" + coordinatorid] != null && HttpContext.Session["CoordinatorState_" + coordinatorid] is CoordinatorStatusTracking)
                    overview.CurrentStatus = (CoordinatorStatusTracking)HttpContext.Session["CoordinatorState_" + coordinatorid];
                return View("Details3", overview);
            }
        }