private void TrySetModifier(
            bool isModifierValid,
            out bool hasModifier,
            out PriceChangerEnum sign,
            out decimal percents,
            ScheduleDay priceModifier)
        {
            if (isModifierValid)
            {
                hasModifier = true;
                sign        = priceModifier.PriceChangerSign;
                percents    = priceModifier.PriceModifier;
            }
            else
            {
                hasModifier = false;
                sign        = PriceChangerEnum.None;
                percents    = 0m;
            }

            var hourEntities = priceModifier.Hours
                               .Where(x => x.IsActive)
                               .OrderBy(x => x.StartFromHour)
                               .ThenBy(x => x.StartFromMinutes);

            foreach (var hour in hourEntities)
            {
                var startTime = new DateTime(
                    DateTime.UtcNow.Year,
                    DateTime.UtcNow.Month,
                    DateTime.UtcNow.Day,
                    hour.StartFromHour,
                    hour.StartFromMinutes,
                    0).ToUniversalTime();
                var endTime = new DateTime(
                    DateTime.UtcNow.Year,
                    DateTime.UtcNow.Month,
                    DateTime.UtcNow.Day,
                    hour.EndAtHour,
                    hour.EndAtMinutes,
                    0).ToUniversalTime();

                bool inTime = DateTime.UtcNow >= startTime && DateTime.UtcNow <= endTime;

                bool hasHourModifier = hour.PriceChangerSign != PriceChangerEnum.None && hour.PriceModifier > 0;

                if (hour.IsActive && inTime && hasHourModifier)
                {
                    hasModifier = true;
                    sign        = hour.PriceChangerSign;
                    percents    = hour.PriceModifier;
                    break;
                }
            }
        }
        public decimal GetPricePerGame(
            IServiceProvider serviceProvider,
            IList <ScheduleDay> egmPriceModifiers,
            EGM game)
        {
            if (egmPriceModifiers == null || !egmPriceModifiers.Any())
            {
                return(game.PricePerGame);
            }
            bool hasModifier = false;
            //ScheduleDay modifier;
            PriceChangerEnum sign     = PriceChangerEnum.None;
            decimal          percents = 0m;

            // get modifier
            foreach (var priceModifier in egmPriceModifiers)
            {
                bool isModifierValid = priceModifier.PriceChangerSign != PriceChangerEnum.None && priceModifier.PriceModifier > 0;
                if (priceModifier.IsActive && priceModifier.IsDateRange)
                {
                    if (DateTime.UtcNow >= priceModifier.From && DateTime.UtcNow <= priceModifier.To)
                    {
                        TrySetModifier(isModifierValid, out hasModifier, out sign, out percents, priceModifier);
                    }
                    if (hasModifier)
                    {
                        break;
                    }
                }
                else if (priceModifier.IsActive)
                {
                    var currentDay = (int)DateTime.UtcNow.DayOfWeek;
                    if (currentDay == 0)
                    {
                        currentDay = 7;
                    }
                    if (currentDay == priceModifier.DayOfWeek)
                    {
                        TrySetModifier(isModifierValid, out hasModifier, out sign, out percents, priceModifier);
                        if (hasModifier)
                        {
                            break;
                        }
                    }
                }
            }
            // modified price per game
            var pricePerGame = game.PricePerGame;

            if (hasModifier)
            {
                if (sign == PriceChangerEnum.Add)
                {
                    pricePerGame += ((pricePerGame / 100) * percents);
                }
                else if (sign == PriceChangerEnum.Subtract)
                {
                    pricePerGame -= ((pricePerGame / 100) * percents);
                }
            }
            return(pricePerGame);
        }