public void AddItem(RewardItem item)
        {
            var id = item.Id;

            if (Items.ContainsKey(id))
            {
                Items[id].Amount += item.Amount;
            }
            else
            {
                Items.Add(id, item);
            }
        }
        public IList <RewardItem> SimulateBarrowsRewardChest(List <BarrowsBrother> brothersKilled, int totalLevelOfCryptMonstersKilled, bool completedHardDiary)
        {
            var rewardItems = new List <RewardItem>();
            var potentialBarrowsEquipment = new List <RewardItem>();

            var numBrothersKilled = brothersKilled.Count;

            if (numBrothersKilled > 0)
            {
                foreach (var barrowsBrother in brothersKilled)
                {
                    foreach (var rewardItemId in barrowsBrother.Rewards)
                    {
                        var rewardItem = new RewardItem {
                            Id = rewardItemId
                        };
                        potentialBarrowsEquipment.Add(rewardItem);
                    }
                }
            }

            var totalRolls           = 1 + numBrothersKilled;
            int totalRewardPotential = ChanceHelper.CalculateRewardPotential(totalLevelOfCryptMonstersKilled, brothersKilled);


            //    Console.WriteLine($"Total Rolls = {totalRolls}, Total Level / Potential = {totalLevel}/{totalRewardPotential}, Potential Barrows = {potentialBarrowsEquipment.Count}");

            for (var roll = 1; roll <= totalRolls; roll++)
            {
                bool wonBarrowsItem = numBrothersKilled == 0 ? false : ChanceHelper.RollAgainstBarrowsItem(numBrothersKilled);

                if (wonBarrowsItem)
                {
                    var randomIndex = RandomHelper.Instance.Next(potentialBarrowsEquipment.Count);
                    var chosenItem  = potentialBarrowsEquipment[randomIndex];
                    // remove the item from the potential list so we don't roll for it again
                    potentialBarrowsEquipment.RemoveAt(randomIndex);
                    rewardItems.Add(chosenItem);
                }
                else
                {
                    var rolledRewardPotential = RandomHelper.Instance.Next(0, totalRewardPotential + 1);

                    foreach (var itemDefinition in _rewardItemDefinitionService.GetOtherRewardDefinitions().Values)
                    {
                        if (rolledRewardPotential < itemDefinition.RewardPotentialRequirement)
                        {
                            continue;
                        }

                        var min = itemDefinition.RewardPotentialRequirement;
                        var max = itemDefinition.MaxRewardPotentialRequirement;

                        // in order to receive an item, rolled RP should be between the item's minimum unlock requirement and the maximum unlock requirement of the next item in the table
                        if (rolledRewardPotential >= min && rolledRewardPotential <= max)
                        {
                            var minQuantity = Math.Floor(min / itemDefinition.Divisor);
                            var maxQuantity = Math.Floor(Math.Min(max, rolledRewardPotential) /
                                                         itemDefinition.Divisor);


                            if (itemDefinition.Rune && completedHardDiary)
                            {
                                minQuantity = Math.Floor(minQuantity * 1.5);
                                maxQuantity = Math.Floor(maxQuantity * 1.5);
                            }

                            var randomQuantity = RandomHelper.Instance.Next((int)minQuantity, (int)(maxQuantity + 1));


                            var itemToAdd = new RewardItem {
                                Id = itemDefinition.Id, Amount = randomQuantity
                            };

                            //         Console.WriteLine($"Total = {totalRewardPotential}, rolled = {rolledRewardPotential}, minQty = {minQuantity}, maxQty = {maxQuantity}, randomQty = {randomQuantity}, recieved = {itemDefinition.Name}, {itemDefinition.RewardPotentialRequirement}, {itemDefinition.MaxRewardPotentialRequirement}");


                            rewardItems.Add(itemToAdd);
                        }
                    }
                }
            }

            return(rewardItems);
        }