public List <UsageBlock> BreaksInContinousUsageForTimeFrame(DateTime startTime, DateTime endTime,
                                                                    TimeSpan maxAllowedGapInMillis)
        {
            List <UsageBlock> usageList = BlocksOfContinousUsageForTimeFrame(startTime, endTime, maxAllowedGapInMillis);

            List <UsageBlock> notUsageList  = new List <UsageBlock>();
            UsageBlock        notUsageBlock = new UsageBlock();

            foreach (UsageBlock usageBlock in usageList)
            {
                if (notUsageBlock.StartTime == default && notUsageBlock.EndTime == default)
                {
                    notUsageBlock.StartTime = usageBlock.EndTime;
                }
                else if (notUsageBlock.StartTime != default && notUsageBlock.EndTime == default)
                {
                    notUsageBlock.EndTime = usageBlock.StartTime;
                }

                if (notUsageBlock.StartTime != default && notUsageBlock.EndTime != default)
                {
                    notUsageList.Add(notUsageBlock);
                    notUsageBlock = new UsageBlock
                    {
                        StartTime = usageBlock.EndTime
                    };
                }
            }

            return(notUsageList);
        }
        public List <UsageBlock> BlocksOfContinousUsageForTimeFrame(DateTime startTime, DateTime endTime,
                                                                    TimeSpan maxAllowedGapInMillis)
        {
            List <HighPrecisionUsageModel> filteredUsages = ComposeListOfUsages(startTime, endTime);

            List <UsageBlock> blockList = new List <UsageBlock>();
            UsageBlock        block     = new UsageBlock();

            foreach (HighPrecisionUsageModel usage in filteredUsages)
            {
                if (block.StartTime == default && block.EndTime == default)
                {
                    block.StartTime = usage.StartTime;
                    block.EndTime   = usage.EndTime;
                }

                if ((usage.StartTime - block.EndTime) <= maxAllowedGapInMillis)
                {
                    block.EndTime = usage.EndTime;
                }
                else
                {
                    blockList.Add(block);
                    block = new UsageBlock(usage.StartTime, usage.EndTime);
                }
            }

            if (!blockList.Any(sm => sm.Id == block.Id))
            {
                blockList.Add(block);
            }

            return(blockList);
        }