private void UpdateKeywords(Product[] products, ProductType[] prodTypes, BuildingUpgrade[] buildingUpgrades, BuildingUpgrade bu)
        {
            foreach (var prod in products)
            {
                var pt = prodTypes.FirstOrDefault(x => x.Id == prod.ProductTypeId);
                if (pt != null)
                {

                    prod.Keywords.Add(pt.ManufacturerType.Name);
                }
                if (buildingUpgrades != null)
                foreach (var ug in buildingUpgrades.Where(x => x.Products.Any(y => y.ProductTypeId == prod.ProductTypeId)))
                {
                    prod.Keywords.Add(ug.Name);
                }
                if (bu != null)
                    prod.Keywords.Add(bu.Name);
            }
        }
        public void Update(ProductType[] prodTypes, City city)
        {
            foreach (var prod in city.CurrentCityStorage.CurrentInventory)
            {
            //                foreach (var prod2 in city.RequiredProducts)
            //                    prod2.StorageQuantity = storageProduct.Quantity;
                UpdateProductStorageQuantity(city.RequiredProducts, prod);
                UpdateProductStorageQuantity(city.AvailableStorage, prod);
                UpdateProductStorageQuantity(city.TotalProductsRequired, prod);
            }

            UpdateKeywords(city.RequiredProducts, prodTypes, city.BuildingUpgrades, null);

            foreach (var bu in city.BuildingUpgrades)
            {
                UpdateKeywords(bu.Products, prodTypes, null, bu);
                var buildingUpgradeTooltip = new StringBuilder();
                buildingUpgradeTooltip.Append("<div>");
                //add total hours remaining
                buildingUpgradeTooltip.AppendFormat("{0}:{1} hrs of {2}:{3} hrs time remaining<br/>", (bu.RemainingUpgradeTime / 60), (bu.RemainingUpgradeTime % 60), (bu.TotalUpgradeTime / 60), (bu.TotalUpgradeTime % 60));

                foreach (var requiredProduct in bu.Products)
                {
                    var prodType = prodTypes.First(x => x.Id == requiredProduct.ProductTypeId);
                    var strgProd = city.CurrentCityStorage.CurrentInventory.FirstOrDefault(x => x.ProductTypeId == requiredProduct.ProductTypeId);

                    var reequiredProductTootip = new StringBuilder();
                    if (strgProd != null)
                    {
                        requiredProduct.StorageQuantity = strgProd.Quantity ?? 0;
                        requiredProduct.RequiredProducts = Enumerable.ToArray(prodType.RequiredProducts.ToArray().Select(Mapper.Map<Product>));
                        var notInStorage = strgProd.Quantity < requiredProduct.Quantity;
                        var style = notInStorage
                            ? "display: block; color: red"
                            : "display: block";
                        buildingUpgradeTooltip.AppendFormat("<span style='{0}'>{1} {2} required of {3} in storage</span>", style, requiredProduct.Quantity, requiredProduct.Name, strgProd.Quantity);
                        reequiredProductTootip.AppendFormat("<span style='{0}'>{1} {2} required of {3} in storage</span>", style, requiredProduct.Quantity, requiredProduct.Name, strgProd.Quantity);
                        if (notInStorage)
                        {

                            foreach (var requiredSubProduct in requiredProduct.RequiredProducts)
                            {
                                var subStrgProd = city.CurrentCityStorage.CurrentInventory.FirstOrDefault(x => x.ProductTypeId == requiredSubProduct.ProductTypeId);
                                if (subStrgProd != null)
                                {
                                    requiredSubProduct.StorageQuantity = subStrgProd.Quantity ?? 0;
                                    var totalQuantityRequired = requiredSubProduct.Quantity * requiredProduct.Quantity;
                                    var subStyle = subStrgProd.Quantity < totalQuantityRequired
                                        ? "display: block; color: red"
                                        : "display: block";
                                    reequiredProductTootip.AppendFormat("<span style='{0}'>{1} {2} required of {3} in storage</span>", subStyle, totalQuantityRequired, subStrgProd.Name, subStrgProd.Quantity);
                                }
                                else
                                {
                                    buildingUpgradeTooltip.AppendFormat("<span style='display: block'>{0} {1} required", requiredSubProduct.Quantity,
                                        prodTypes.First(x => x.Id == requiredSubProduct.ProductTypeId).Name);
                                }
                            }
                        }
                    }
                    else
                        buildingUpgradeTooltip.AppendFormat("<span style='display: block'>{0} {1} required", requiredProduct.Quantity, requiredProduct.Name);

                    requiredProduct.RequiredProductsToolTip = reequiredProductTootip.ToString();
                }
                buildingUpgradeTooltip.Append("</div>");
                bu.Tooltip = buildingUpgradeTooltip.ToString();
            }
        }
 private void UpdateBuildingUpgradeUiInfo(ProductType[] prodTypes, City city)
 {
     _buildingUiInfoUpdater.Update(prodTypes, city);
 }
 public void Update(ProductType[] prodTypes, City city)
 {
     throw new System.NotImplementedException();
 }
 private CalculateStorageResponse CalculateNewCityStorageAmounts(SupplyChainRequest request, BuildingUpgradeHandlerRequest calcRequest, ProductType[] productTypes)
 {
     var strgResults = new CalculateStorageResponse
     {
         CityStorage = calcRequest.City.CurrentCityStorage
     };
     //If we have products queued for production then calculate the new city storage.
     if (request.RequiredProductUpdates == null) return strgResults;
     var calculateStorageRequest = new CalculateStorageRequest
     {
         ProductTypes = productTypes,
         NewProductQuantities = request.RequiredProductUpdates.Select(Mapper.Map<Handler.Entities.Product>).ToArray(),
         CityStorage = calcRequest.City.CurrentCityStorage
     };
     return _cityStorageCalculator.CalculateNewStorageAmounts(calculateStorageRequest);
 }