public static async Task<ChangesViewModel> CreateAsync(IStatusDataRepository statusDataRepository, DateTime date)
        {
            var ieChangeSetsTask = GetChangeSetsByBrowser(statusDataRepository, StatusDataType.InternetExplorer, date);
            var chromeChangeSetsTask = GetChangeSetsByBrowser(statusDataRepository, StatusDataType.Chromium, date);
            var webkitWebCoreChangeSetsTask = GetChangeSetsByBrowser(statusDataRepository, StatusDataType.WebKitWebCore, date);
            var webkitJavaScriptCoreChangeSetsTask = GetChangeSetsByBrowser(statusDataRepository, StatusDataType.WebKitJavaScriptCore, date);
            var mozillaChangeSetsTask = GetChangeSetsByBrowser(statusDataRepository, StatusDataType.Mozilla, date);

            await Utility.Measure(() => Task.WhenAll(
                ieChangeSetsTask,
                chromeChangeSetsTask,
                webkitWebCoreChangeSetsTask,
                webkitJavaScriptCoreChangeSetsTask,
                mozillaChangeSetsTask));

            var ieChangeSets = ieChangeSetsTask.Result;
            var chromeChangeSets = chromeChangeSetsTask.Result;
            var webkitWebCoreChangeSets = webkitWebCoreChangeSetsTask.Result;
            var webkitJavaScriptCoreChangeSets = webkitJavaScriptCoreChangeSetsTask.Result;
            var mozillaChangeSets = mozillaChangeSetsTask.Result;

            return new ChangesViewModel()
            {
                ChangeSets = new ChangeSetsViewModel()
                             {
                                 IeChangeSet = ieChangeSets.Any() ? ieChangeSets[0] : null,
                                 ChromeChangeSet = chromeChangeSets.Any() ? chromeChangeSets[0] : null,
                                 WebKitWebCoreChangeSet = webkitWebCoreChangeSets.Any() ? webkitWebCoreChangeSets[0] : null,
                                 WebKitJavaScriptCoreChangeSet = webkitJavaScriptCoreChangeSets.Any() ? webkitJavaScriptCoreChangeSets[0] : null,
                                 MozillaChangeSet = mozillaChangeSets.Any() ? mozillaChangeSets[0] : null,
                },
                Date = date,
            };
        }
        private static async Task<ChangeSet[]> GetChangeSetsByBrowserAsync(IStatusDataRepository statusDataRepository, StatusDataType type)
        {
            var statusDataSet = (await statusDataRepository.GetPlatformStatusesRangeAsync(type, DateTime.UtcNow.AddMonths(-6), DateTime.UtcNow, take: 30))
                                                           .OrderByDescending(x => x.Date)
                                                           .ToArray();

            if (statusDataSet.Length < 2)
            {
                return new ChangeSet[0];
            }

            return ChangeSet.GetChangeSetsFromPlatformStatuses(statusDataSet);
        }
        private static async Task<ChangeSet[]> GetChangeSetsByBrowser(IStatusDataRepository statusDataRepository, StatusDataType type, DateTime date)
        {
            var statusDataSet = (await Utility.Measure(() => statusDataRepository.GetPlatformStatusesRangeAsync(type, date.AddMonths(-6), date, take: 2)))
                                                           .OrderByDescending(x => x.Date)
                                                           .Take(2)
                                                           .ToArray();

            if (statusDataSet.Length < 2)
            {
                return new ChangeSet[0];
            }

            return ChangeSet.GetChangeSetsFromPlatformStatuses(statusDataSet);
        }
        public static async Task<HomeIndexViewModel> CreateAsync(IStatusDataRepository statusDataRepository)
        {
#if !FALSE
            var ieChangeSetsTask = GetChangeSetsByBrowserAsync(statusDataRepository, StatusDataType.InternetExplorer);
            var chromeChangeSetsTask = GetChangeSetsByBrowserAsync(statusDataRepository, StatusDataType.Chromium);
            var webkitWebCoreChangeSetsTask = GetChangeSetsByBrowserAsync(statusDataRepository, StatusDataType.WebKitWebCore);
            var webkitJavaScriptCoreChangeSetsTask = GetChangeSetsByBrowserAsync(statusDataRepository, StatusDataType.WebKitJavaScriptCore);
            var mozillaChangeSetsTask = GetChangeSetsByBrowserAsync(statusDataRepository, StatusDataType.Mozilla);
            var lastUpdatedTask = statusDataRepository.GetLastUpdated();

            await Task.WhenAll(ieChangeSetsTask, chromeChangeSetsTask, webkitWebCoreChangeSetsTask, webkitJavaScriptCoreChangeSetsTask, mozillaChangeSetsTask, lastUpdatedTask);

            var ieChangeSets = ieChangeSetsTask.Result;
            var chromeChangeSets = chromeChangeSetsTask.Result;
            var webkitWebCoreChangeSets = webkitWebCoreChangeSetsTask.Result;
            var webkitJavaScriptCoreChangeSets = webkitJavaScriptCoreChangeSetsTask.Result;
            var mozillaChangeSets = mozillaChangeSetsTask.Result;
            var lastUpdated = lastUpdatedTask.Result;
#else
            var ieChangeSets = await GetChangeSetsByBrowserAsync(statusDataRepository, StatusDataType.InternetExplorer);
            var chromeChangeSets = await GetChangeSetsByBrowserAsync(statusDataRepository, StatusDataType.Chromium);
            var webkitWebCoreChangeSets = await GetChangeSetsByBrowserAsync(statusDataRepository, StatusDataType.WebKitWebCore);
            var webkitJavaScriptCoreChangeSets = await GetChangeSetsByBrowserAsync(statusDataRepository, StatusDataType.WebKitJavaScriptCore);
            var mozillaChangeSets = await GetChangeSetsByBrowserAsync(statusDataRepository, StatusDataType.Mozilla);
            var lastUpdated = await statusDataRepository.GetLastUpdated();
#endif

            return new HomeIndexViewModel()
                   {
                       IeChangeSetsByDate = ieChangeSets.ToDictionary(k => k.Date, v => v),
                       ChromeChangeSetsByDate = chromeChangeSets.ToDictionary(k => k.Date, v => v),
                       WebKitWebCoreChangeSetsByDate = webkitWebCoreChangeSets.ToDictionary(k => k.Date, v => v),
                       WebKitJavaScriptCoreChangeSetsByDate = webkitJavaScriptCoreChangeSets.ToDictionary(k => k.Date, v => v),
                       MozillaChangeSetsByDate = mozillaChangeSets.ToDictionary(k => k.Date, v => v),
                       Dates = new [] { ieChangeSets, chromeChangeSets, webkitWebCoreChangeSets, webkitJavaScriptCoreChangeSets, mozillaChangeSets }
                            .SelectMany(x => x)
                            .Where(x => x.Changes.Any())
                            .Select(x => x.Date)
                            .Distinct()
                            .ToArray(),
                       LastUpdatedAt = lastUpdated,
                   };
        }
 public DataUpdateAgent(IStatusDataRepository repository)
 {
     _statusDataRepository = repository;
 }