private Item GetItem(int level, List <ItemDefinition> definitions)
        {
            var result = new Item();

            var definitionCount     = definitions.Count();
            var itemDefinitionIndex = _calculationService.GetRandomInteger(0, definitionCount, true);
            var itemDefinition      = definitions[itemDefinitionIndex];

            // Generate values
            var itemLevel      = _levelService.GenerateItemLevel(itemDefinition, level, _initializer.ItemLevelScale);
            var itemRarity     = _rarityService.ChooseRarity(itemDefinition.RarityIds, _initializer);
            var itemName       = _nameService.GenerateItemName(itemDefinition);
            var itemProperties = _propertyService.GenerateProperties(itemLevel, itemDefinition, itemRarity, _initializer);
            var sockets        = _socketService.GenerateNumberOfSockets(itemDefinition);

            // Map item result
            result.TypeId          = itemDefinition.TypeId;
            result.CategoryId      = itemDefinition.CategoryId;
            result.ItemLevel       = itemLevel;
            result.RarityTypeId    = itemRarity.TypeId;
            result.RarityName      = itemRarity.Name;
            result.ItemName        = itemName;
            result.ItemDescription = itemDefinition.Description;
            result.Sockets         = sockets;
            result.Properties      = itemProperties;

            return(result);
        }