private AnalysedResult runPostAnalysers(IEnumerable <AnalysedResult> analysed)
        {
            var results = new List <IAnalyseResult>();
            var res     = new AnalysedResult()
            {
                Results = results,
                Source  = new PostAnalyserSource()
            };

            foreach (var analyser in this.Config.PostAnalysers)
            {
                Dictionary <string, int> passed = new Dictionary <string, int>();

                var locations = new List <String>();
                foreach (var id in analyser.When)
                {
                    foreach (var sourceItem in analysed)
                    {
                        if (sourceItem.Results != null)
                        {
                            foreach (var result in sourceItem.Results)
                            {
                                var actionResult = result as IAnalyseActionResult;
                                if (actionResult != null)
                                {
                                    if (actionResult.Action.Id == id)
                                    {
                                        if (passed.ContainsKey(id))
                                        {
                                            passed[id]++;
                                        }
                                        else
                                        {
                                            passed.Add(id, 1);
                                        }

                                        var location = result as ILocation;
                                        if (location != null)
                                        {
                                            locations.AddRange(location.Locations);
                                        }
                                    }
                                }
                            }
                        }
                    }
                }
                if (analyser.When.Length > 0 && analyser.When.Length == passed.Keys.Count)
                {
                    results.Add(new PostAnalyseResult()
                    {
                        DisplayMessage = analyser.Then.DisplayMessage,
                        Severity       = analyser.Then.Severity,
                        Locations      = locations
                    });
                }
            }

            return(res);
        }
        private AnalysedResult GetBatteryStatusOfSerialNumberGroup(List <BatteryData> groupedBatteryData)
        {
            var analysedResult = new AnalysedResult(groupedBatteryData.FirstOrDefault().serialNumber);

            //Order by timestamp
            var orderedGroupedBatteryData = groupedBatteryData.OrderBy(batteryData => batteryData.timestamp).ToList();

            //Initialization of required vars
            var previousBatteryLevel = 1.00;

            var continousDecrementedBatteryLevel = new List <BatteryLevelTimestamp>();
            var batteryLevelAvgTillIncrement     = new List <double>();

            //Iterate over the list
            orderedGroupedBatteryData.ForEach(batteryData => {
                if (batteryData.batteryLevel <= previousBatteryLevel)
                {
                    //Add the Object in the continous decremented battery level list
                    continousDecrementedBatteryLevel.Add(new BatteryLevelTimestamp(batteryData.batteryLevel, batteryData.timestamp));
                }
                else
                {
                    //Check if there are required elements available to find the average
                    if (continousDecrementedBatteryLevel.Count >= 2)
                    {
                        var percentageDecreaseInADay = GetPercentageDecreaseInADay(continousDecrementedBatteryLevel);

                        batteryLevelAvgTillIncrement.Add(percentageDecreaseInADay);
                        //Clear the continous list as we found the increment in the battery
                        continousDecrementedBatteryLevel.Clear();
                    }
                }
                previousBatteryLevel = batteryData.batteryLevel;
            });

            //handled the corner case where in the end there is no increment in the battery level
            if (continousDecrementedBatteryLevel.Count >= 2)
            {
                var percentageDecreaseInADay = GetPercentageDecreaseInADay(continousDecrementedBatteryLevel);

                batteryLevelAvgTillIncrement.Add(percentageDecreaseInADay);
                //Clear the continous list as we found the increment in the battery
                continousDecrementedBatteryLevel.Clear();
            }

            //find the Average of Average battery level (final average)
            if (batteryLevelAvgTillIncrement.Any())
            {
                if (batteryLevelAvgTillIncrement.Average() <= 30)
                {
                    analysedResult.batteryStatus = BatteryStatus.Good;
                }
                else
                {
                    analysedResult.batteryStatus = BatteryStatus.Faulty;
                }
                analysedResult.averageConsumption = batteryLevelAvgTillIncrement.Average();
            }
            else
            {
                analysedResult.batteryStatus = BatteryStatus.Unknown;
            }
            return(analysedResult);
        }