using Google.Protobuf.Collections; using System; using System.Collections; using System.Collections.Generic; using System.Linq; using System.Reflection; using System.Text; using System.Threading.Tasks; using Tango.PMR.Diagnostics; using Tango.PMR.Insights; namespace Tango.Insights { public static class InsightsHelper { private static List _diagnosticsProperties; private static List _insightsProperties; static InsightsHelper() { _diagnosticsProperties = new List(); _insightsProperties = new List(); foreach (var prop in typeof(DiagnosticsMonitors).GetProperties(BindingFlags.Public | BindingFlags.Instance | BindingFlags.DeclaredOnly)) { _diagnosticsProperties.Add(prop); } foreach (var prop in typeof(InsightsMonitors).GetProperties(BindingFlags.Public | BindingFlags.Instance | BindingFlags.DeclaredOnly)) { _insightsProperties.Add(prop); } } public static InsightsMonitors MapMonitors(DiagnosticsMonitors diagnosticsMonitors) { InsightsMonitors insightsMonitors = new InsightsMonitors(); for (int i = 0; i < _diagnosticsProperties.Count; i++) { if (_diagnosticsProperties[i].PropertyType == typeof(RepeatedField)) { var arr = _diagnosticsProperties[i].GetValue(diagnosticsMonitors) as RepeatedField; if (arr.Count > 0) { _insightsProperties[i].SetValue(insightsMonitors, arr.Average()); } } } return insightsMonitors; } public static InsightsMonitors AverageMonitors(List insightsMonitorsCollection) { InsightsMonitors monitors = new InsightsMonitors(); foreach (var prop in _insightsProperties.Where(x => !typeof(IEnumerable).IsAssignableFrom(x.PropertyType)).ToList()) { prop.SetValue(monitors, insightsMonitorsCollection.Average(x => (double)prop.GetValue(x))); } return monitors; } public static InsightsMonitors AverageMonitors(List diagnosticsMonitorsCollection) { List insightsMonitorsCollection = diagnosticsMonitorsCollection.ToList().Select(x => MapMonitors(x)).ToList(); return AverageMonitors(insightsMonitorsCollection); } public static InsightsMonitors CreateEmptyGap() { InsightsMonitors monitors = new InsightsMonitors(); foreach (var prop in _insightsProperties.Where(x => !typeof(IEnumerable).IsAssignableFrom(x.PropertyType)).ToList()) { prop.SetValue(monitors, double.NaN); } return monitors; } } }