public static Processor.Model.SystemReport ToBusinessModel(this Models.SystemReport model)
        {
            if (model == null)
            {
                return(null);
            }

            var componentReports        = model.ComponentReports.Select(componentReport => componentReport.ToBusinessModel()).ToList();
            var systemReportAlertGroups = model.SystemReportAlertGroup.Select(e => e.ToBusinessModel()).ToList();

            var report = new Processor.Model.SystemReport
            {
                Id                     = model.SystemReportId,
                SystemId               = model.SystemId,
                Timestamp              = model.Timestamp,
                ComponentReports       = componentReports,
                SystemReportAlertGroup = systemReportAlertGroups
            };

            return(report);
        }
        public async Task <SystemReport> GenerateReportForSystem(int systemId)
        {
            var timestamp         = DateTime.Now;
            var systemAlertGroups = await _db.AlertGroup.Where(ag => ag.SystemId == systemId).ToListAsync();

            var reportAlertGroups = new List <SystemReportAlertGroup>();

            var report = new Models.SystemReport
            {
                SystemReportId = 0,
                SystemId       = systemId,
                Timestamp      = timestamp
            };

            var systemReportEntity = _db.SystemReport.Add(report);
            await _db.SaveChangesAsync();

            var createdSystemReportId = systemReportEntity.Entity.SystemReportId;

            systemReportEntity.State = EntityState.Detached;

            foreach (var systemAlertGroup in systemAlertGroups)
            {
                var counted = await _db.AlertGroupValue.CountAsync(agv => agv.AlertGroupId == systemAlertGroup.AlertGroupId);

                var temp = new SystemReportAlertGroup
                {
                    SystemReportAlertGroupId = 0,
                    SystemReportId           = createdSystemReportId,
                    AlertGroupId             = systemAlertGroup.AlertGroupId,
                    Count = counted
                };
                reportAlertGroups.Add(temp);
            }

            _db.SystemReportAlertGroup.AddRange(reportAlertGroups);
            await _db.SaveChangesAsync();

            var components = await _db.Component.Where(c => c.SystemId != null && c.SystemId == systemId).ToListAsync();

            foreach (var component in components)
            {
                var componentReportAlerts = new List <ComponentReportAlert>();
                var componentReport       = new ComponentReport
                {
                    ComponentReportId = 0,
                    SystemReportId    = createdSystemReportId,
                    ComponentId       = component.ComponentId,
                    Timestamp         = timestamp
                };

                var componentReportEntity = _db.ComponentReport.Add(componentReport);
                await _db.SaveChangesAsync();

                var createdComponentReportId = componentReportEntity.Entity.ComponentReportId;
                componentReportEntity.State = EntityState.Detached;

                var componentAlerts = await _db.Alert.Where(a => a.ComponentId == component.ComponentId).ToListAsync();

                foreach (var componentAlert in componentAlerts)
                {
                    var alertCount = await _db.AlertValue.CountAsync(av => av.AlertId == componentAlert.AlertId);

                    var temp = new ComponentReportAlert
                    {
                        ComponentReportAlertId = 0,
                        AlertId           = componentAlert.AlertId,
                        Count             = alertCount,
                        ComponentReportId = createdComponentReportId
                    };
                    componentReportAlerts.Add(temp);
                }

                _db.ComponentReportAlert.AddRange(componentReportAlerts);
                await _db.SaveChangesAsync();
            }

            return(await GetReport(createdSystemReportId));
        }