private void SetupLevelInfo(ref float widestWidth)
        {
            var levelUpInfoLabel = AddUIComponent <UILabel>();

            levelUpInfoLabel.name          = "Level Up Info Label";
            levelUpInfoLabel.text          = "Level Up Requirement";
            levelUpInfoLabel.textScale     = 0.9f;
            levelUpInfoLabel.isInteractive = false;

            Inputs.Add(UiUtils.CreateInfoField(this, "LevelUpInfo", -201, LevelUpInfo));
            _labels.Add(levelUpInfoLabel);

            if (levelUpInfoLabel.width + UiUtils.FieldWidth + UiUtils.FieldMargin * 6 > widestWidth)
            {
                widestWidth = levelUpInfoLabel.width + UiUtils.FieldWidth + UiUtils.FieldMargin * 6;
            }

            var levelUpProgressLabel = AddUIComponent <UILabel>();

            levelUpProgressLabel.name          = "Level Up Progress Label";
            levelUpProgressLabel.text          = "Level Up Progress";
            levelUpProgressLabel.textScale     = 0.9f;
            levelUpProgressLabel.isInteractive = false;

            Inputs.Add(UiUtils.CreateInfoField(this, "LevelUpProgress", -201,
                                               $"{Convert.ToInt32(LevelUpProgress * 100)}%"));
            _labels.Add(levelUpProgressLabel);

            if (levelUpProgressLabel.width + UiUtils.FieldWidth + UiUtils.FieldMargin * 6 > widestWidth)
            {
                widestWidth = levelUpProgressLabel.width + UiUtils.FieldWidth + UiUtils.FieldMargin * 6;
            }

            var levelLabel = AddUIComponent <UILabel>();

            levelLabel.name          = "Building Level Label";
            levelLabel.text          = "Building Level";
            levelLabel.textScale     = 0.9f;
            levelLabel.isInteractive = false;

            Inputs.Add(UiUtils.CreateInfoField(this, "BuildingLevel", -201, $"{SelectedBuilding.GetClassLevel()}"));
            _labels.Add(levelLabel);
        }
        private void SetupRates(BuildingAI ai, Building building, InstanceID instanceId, ref float widestWidth)
        {
            bool _ = ai.GetFireParameters(instanceId.Building, ref building, out FireHazard, out int _,
                                          out FireTolerance);

            switch (SelectedBuilding.m_class.m_service)
            {
            case ItemClass.Service.Industrial:
            {
                var industrialAI = (IndustrialBuildingAI)ai;


                ElectricityConsumption = industrialAI.GetElectricityRate(instanceId.Building, ref building);
                WaterConsumption       = industrialAI.GetWaterRate(instanceId.Building, ref building);
                IncomeAccumulation     = industrialAI.GetResourceRate(instanceId.Building, ref building,
                                                                      EconomyManager.Resource.PrivateIncome);
                GarbageAccumulation = industrialAI.GetGarbageRate(instanceId.Building, ref building);
                LevelUpInfo         =
                    industrialAI.GetLevelUpInfo(instanceId.Building, ref building, out LevelUpProgress);

                Pollution = industrialAI.GetResourceRate(instanceId.Building, ref building,
                                                         NaturalResourceManager.Resource.Pollution);
                NoisePollution = industrialAI.GetResourceRate(instanceId.Building, ref building,
                                                              ImmaterialResourceManager.Resource.NoisePollution);

                var transferMethod = industrialAI.GetType().GetMethod("GetOutgoingTransferReason",
                                                                      BindingFlags.Instance | BindingFlags.NonPublic);

                _transferReason = (TransferManager.TransferReason)transferMethod.Invoke(industrialAI, null);

                ProducedProduct = _transferReason.ToString();
            }
            break;

            case ItemClass.Service.Commercial:
            {
                var commercialAI = (CommercialBuildingAI)ai;

                LevelUpInfo =
                    commercialAI.GetLevelUpInfo(instanceId.Building, ref building, out LevelUpProgress);


                Pollution = commercialAI.GetResourceRate(instanceId.Building, ref building,
                                                         NaturalResourceManager.Resource.Pollution);
                NoisePollution = commercialAI.GetResourceRate(instanceId.Building, ref building,
                                                              ImmaterialResourceManager.Resource.NoisePollution);


                ElectricityConsumption = commercialAI.GetElectricityRate(instanceId.Building, ref building);
                WaterConsumption       = commercialAI.GetWaterRate(instanceId.Building, ref building);
                IncomeAccumulation     = commercialAI.GetResourceRate(instanceId.Building, ref building,
                                                                      EconomyManager.Resource.PrivateIncome);
                GarbageAccumulation = commercialAI.GetGarbageRate(instanceId.Building, ref building);

                IncomingResource = commercialAI.m_incomingResource.ToString();

                var transferMethod = commercialAI.GetType().GetMethod("GetOutgoingTransferReason",
                                                                      BindingFlags.Instance | BindingFlags.NonPublic);

                _transferReason = (TransferManager.TransferReason)transferMethod.Invoke(commercialAI, null);

                ProducedProduct = _transferReason.ToString();
            }
            break;

            case ItemClass.Service.Residential:
            {
                var residentialAI = (ResidentialBuildingAI)ai;

/*
 *                      ElectricityConsumption = residentialAI.GetElectricityRate(instanceId.Building, ref building);
 *                      WaterConsumption = residentialAI.GetWaterRate(instanceId.Building, ref building);
 *                      IncomeAccumulation = residentialAI.GetResourceRate(instanceId.Building, ref building,
 *                          EconomyManager.Resource.PrivateIncome);
 *                      GarbageAccumulation = residentialAI.GetGarbageRate(instanceId.Building, ref building);
 */

                residentialAI.GetConsumptionRates(SelectedBuilding.GetClassLevel(),
                                                  new Randomizer(instanceId.Building), 100, out ElectricityConsumption, out WaterConsumption,
                                                  out SewageAccumulation, out GarbageAccumulation, out IncomeAccumulation, out MailAccumulation);

                LevelUpInfo =
                    residentialAI.GetLevelUpInfo(instanceId.Building, ref building, out LevelUpProgress);


                Pollution = residentialAI.GetResourceRate(instanceId.Building, ref building,
                                                          NaturalResourceManager.Resource.Pollution);
                NoisePollution = residentialAI.GetResourceRate(instanceId.Building, ref building,
                                                               ImmaterialResourceManager.Resource.NoisePollution);
            }
            break;
            }


            Dictionary <string, int> _consumptionRates = new Dictionary <string, int>
            {
                { "Electricity Consumption", ElectricityConsumption },
                { "Water Consumption", WaterConsumption },
                { "Sewage Accumulation", SewageAccumulation },
                { "Garbage Accumulation", GarbageAccumulation },
                { "Income Accumulation", IncomeAccumulation },
                { "Pollution", Pollution },
                { "Noise Pollution", NoisePollution },
                { "Fire Hazard", FireHazard },
                { "Fire Tolerance", FireTolerance },
                { "Mail Accumulation", MailAccumulation }
            };


            foreach (var kvp in _consumptionRates)
            {
                var label = AddUIComponent <UILabel>();
                label.name          = kvp.Key + "Label";
                label.text          = kvp.Key;
                label.textScale     = 0.9f;
                label.isInteractive = false;

                Inputs.Add(UiUtils.CreateInfoField(this, kvp.Key, kvp.Value));
                _labels.Add(label);

                if (label.width + UiUtils.FieldWidth + UiUtils.FieldMargin * 6 > widestWidth)
                {
                    widestWidth = label.width + UiUtils.FieldWidth + UiUtils.FieldMargin * 6;
                }
            }

            if (!string.IsNullOrEmpty(IncomingResource))
            {
                var resourceLabel = AddUIComponent <UILabel>();
                resourceLabel.name          = "IncomingResourceLabel";
                resourceLabel.text          = "Incoming Resource";
                resourceLabel.textScale     = 0.9f;
                resourceLabel.isInteractive = false;

                Inputs.Add(UiUtils.CreateInfoField(this, "IncomingResource", -201, IncomingResource));
                _labels.Add(resourceLabel);


                if (resourceLabel.width + UiUtils.FieldWidth + UiUtils.FieldMargin * 6 > widestWidth)
                {
                    widestWidth = resourceLabel.width + UiUtils.FieldWidth + UiUtils.FieldMargin * 6;
                }
            }

            if (!string.IsNullOrEmpty(ProducedProduct))
            {
                var producedLabel = AddUIComponent <UILabel>();
                producedLabel.name          = "OutgoingResource";
                producedLabel.text          = "Outgoing Resource";
                producedLabel.textScale     = 0.9f;
                producedLabel.isInteractive = false;

                Inputs.Add(UiUtils.CreateInfoField(this, "OutgoingResource", -201, ProducedProduct));
                _labels.Add(producedLabel);


                if (producedLabel.width + UiUtils.FieldWidth + UiUtils.FieldMargin * 6 > widestWidth)
                {
                    widestWidth = producedLabel.width + UiUtils.FieldWidth + UiUtils.FieldMargin * 6;
                }
            }
        }