/// <summary>
        /// Calculate Nominal Concrete Cover based on PN-EN 1992-1-1 4.4.1.2 (4.2)
        /// Symbol c_min
        /// </summary>
        public ConcreteCoverOutput CalculateMinimumCover(ConcreteCoverInput inputData)
        {
            this.inputData = inputData;

            this.outputData.MinimumCover = Math.Max(this.outputData.MinimumCoverDueToBondRequirement,
                                                    Math.Max(this.outputData.MinimumCoverDueToEnvironmentalConditions + this.inputData.AdditiveSafetyElement - this.inputData.ReductionOfMinimumCoverForUseOfAdditionalProtection - this.inputData.ReductionOfMinimumCoverForUseOfStainlessSteel,
                                                             0.01d));

            return(this.outputData);
        }
        /// <summary>
        /// Calculate Structural Class based on PN-EN 1992-1-1 Table 4.3N
        /// </summary>
        public ConcreteCoverOutput CalculateStructuralClass(ConcreteCoverInput inputData)
        {
            this.inputData = inputData;

            ExposureClass exposureClass = ConvertStringToExposureClass(this.inputData.ExposureClass);
            ConcreteClass concreteClass = ConvertStringToConcreteClass(this.inputData.ConcreteClass);

            this.outputData.StructuralClass = this.inputData.BaseStructuralClass;

            // Check Exposure Class
            if (exposureClass == ExposureClass.X0 || exposureClass == ExposureClass.XC1 ||
                exposureClass == ExposureClass.XC2 || exposureClass == ExposureClass.XC3 ||
                exposureClass == ExposureClass.XC4 || exposureClass == ExposureClass.XD1 ||
                exposureClass == ExposureClass.XD2 || exposureClass == ExposureClass.XS1 ||
                exposureClass == ExposureClass.XD3 || exposureClass == ExposureClass.XS2 ||
                exposureClass == ExposureClass.XS3
                )
            {
                // Modification based on Design Working Life of 100 years
                if (this.inputData.DesignWorkingLifeOf100Years)
                {
                    //this.StructuralClass = (StructuralClass)((int)StructuralClass + 2).Clamp((int)StructuralClass.S1, (int)StructuralClass.S6);
                    this.outputData.StructuralClass = ((int)ConvertStringToStructuralClass(this.outputData.StructuralClass) + 2).ToString();
                }

                // Modification based on Concrete Class and Exposure Class
                if ((concreteClass >= ConcreteClass.C30_37 && (exposureClass == ExposureClass.X0 || exposureClass == ExposureClass.XC1)) ||
                    (concreteClass >= ConcreteClass.C35_45 && (exposureClass == ExposureClass.XC2 || exposureClass == ExposureClass.XC3)) ||
                    (concreteClass >= ConcreteClass.C40_50 && (exposureClass == ExposureClass.XC4 || exposureClass == ExposureClass.XD1 || exposureClass == ExposureClass.XD2 || exposureClass == ExposureClass.XS1)) ||
                    (concreteClass >= ConcreteClass.C45_55 && (exposureClass == ExposureClass.XD3 || exposureClass == ExposureClass.XS2 || exposureClass == ExposureClass.XS3)))
                {
                    //this.StructuralClass = (StructuralClass)((int)StructuralClass - 1).Clamp((int)StructuralClass.S1, (int)StructuralClass.S6);
                    this.outputData.StructuralClass = ((int)ConvertStringToStructuralClass(this.outputData.StructuralClass) - 1).ToString();
                }

                // Modification based on Member With Slab Geometry
                if (this.inputData.MemberWithSlabGeometry)
                {
                    //this.StructuralClass = (StructuralClass)((int)StructuralClass - 1).Clamp((int)StructuralClass.S1, (int)StructuralClass.S6);
                    this.outputData.StructuralClass = ((int)ConvertStringToStructuralClass(this.outputData.StructuralClass) - 1).ToString();
                }

                // Modification based on Member With Slab Geometry
                if (this.inputData.SpecialQualityControlOfTheConcreteProductionEnsured)
                {
                    //this.StructuralClass = (StructuralClass)((int)StructuralClass - 1).Clamp((int)StructuralClass.S1, (int)StructuralClass.S6);
                    this.outputData.StructuralClass = ((int)ConvertStringToStructuralClass(this.outputData.StructuralClass) - 1).ToString();
                }
            }

            this.outputData.StructuralClass = ((int)ConvertStringToStructuralClass(this.outputData.StructuralClass)).Clamp((int)StructuralClass.S1, (int)StructuralClass.S6).ToString();

            return(this.outputData);
        }
        /// <summary>
        /// Calculate Nominal Concrete Cover based on PN-EN 1992-1-1 4.4.1.1 (4.1)
        /// Symbol c_nom
        /// </summary>
        public ConcreteCoverOutput CalculateNominalConcreteCover(ConcreteCoverInput inputData)
        {
            this.inputData = inputData;

            CalculateStructuralClass(inputData);
            CalculateMinimumCoverDueToBondRequirement(inputData);
            CalculateMinimumCoverDueToEnvironmentalConditions(inputData);
            CalculateMinimumCover(inputData);
            this.outputData.NominalCover = this.outputData.MinimumCover + this.inputData.AllowanceInDesignForDeviation;

            return(this.outputData);
        }
        /// <summary>
        /// Calculate Minimum Cover Due To Bond Requirement based on PN-EN 1992-1-1 Table 4.2
        /// Symbol c_min,b
        /// </summary>
        /// <param name="arrangementOfBars"></param>
        public ConcreteCoverOutput CalculateMinimumCoverDueToBondRequirement(ConcreteCoverInput inputData)
        {
            this.inputData = inputData;

            switch (ConvertStringToArrangementOfBars(this.inputData.ArrangementOfBars))
            {
            case ArrangementOfBars.Bundled:
                //TODO - do zaimplementowania
                throw new Exception("Not implemented yet.");

            // case ArrangementOfBars.Separated
            default:
                this.outputData.MinimumCoverDueToBondRequirement = ConvertStringToRebarDiameter(this.inputData.RebarDiameter);
                break;
            }

            if (this.inputData.NominalMaximumAggregateSizeIsGreaterThan32mm)
            {
                this.outputData.MinimumCoverDueToBondRequirement += 0.005d;
            }

            return(this.outputData);
        }
        /// <summary>
        /// Calculate Minimum Cover Due To Environmental Conditions for reinforcement steel based on PN-EN 1992-1-1 Table 4.4N
        /// Symbol c_min,dur
        /// </summary>
        public ConcreteCoverOutput CalculateMinimumCoverDueToEnvironmentalConditions(ConcreteCoverInput inputData)
        {
            this.inputData = inputData;

            // Exposure Class = X0
            if (ConvertStringToExposureClass(this.inputData.ExposureClass) == ExposureClass.X0)
            {
                if (ConvertStringToStructuralClass(this.outputData.StructuralClass) == StructuralClass.S1 || ConvertStringToStructuralClass(this.outputData.StructuralClass) == StructuralClass.S2 ||
                    ConvertStringToStructuralClass(this.outputData.StructuralClass) == StructuralClass.S3 || ConvertStringToStructuralClass(this.outputData.StructuralClass) == StructuralClass.S4)
                {
                    this.outputData.MinimumCoverDueToEnvironmentalConditions = 0.01d;
                }
                else if (ConvertStringToStructuralClass(this.outputData.StructuralClass) == StructuralClass.S5)
                {
                    this.outputData.MinimumCoverDueToEnvironmentalConditions = 0.015d;
                }
                else if (ConvertStringToStructuralClass(this.outputData.StructuralClass) == StructuralClass.S6)
                {
                    this.outputData.MinimumCoverDueToEnvironmentalConditions = 0.02d;
                }
            }

            // Exposure Class = XC1
            else if (ConvertStringToExposureClass(this.inputData.ExposureClass) == ExposureClass.XC1)
            {
                if (ConvertStringToStructuralClass(this.outputData.StructuralClass) == StructuralClass.S1 || ConvertStringToStructuralClass(this.outputData.StructuralClass) == StructuralClass.S2 ||
                    ConvertStringToStructuralClass(this.outputData.StructuralClass) == StructuralClass.S3)
                {
                    this.outputData.MinimumCoverDueToEnvironmentalConditions = 0.01d;
                }
                else if (ConvertStringToStructuralClass(this.outputData.StructuralClass) == StructuralClass.S4)
                {
                    this.outputData.MinimumCoverDueToEnvironmentalConditions = 0.015d;
                }
                else if (ConvertStringToStructuralClass(this.outputData.StructuralClass) == StructuralClass.S5)
                {
                    this.outputData.MinimumCoverDueToEnvironmentalConditions = 0.02d;
                }
                else if (ConvertStringToStructuralClass(this.outputData.StructuralClass) == StructuralClass.S6)
                {
                    this.outputData.MinimumCoverDueToEnvironmentalConditions = 0.025d;
                }
            }
            // Exposure Class = XC2 || XC3
            else if (ConvertStringToExposureClass(this.inputData.ExposureClass) == ExposureClass.XC2 || ConvertStringToExposureClass(this.inputData.ExposureClass) == ExposureClass.XC3)
            {
                if (ConvertStringToStructuralClass(this.outputData.StructuralClass) == StructuralClass.S1)
                {
                    this.outputData.MinimumCoverDueToEnvironmentalConditions = 0.01d;
                }
                else if (ConvertStringToStructuralClass(this.outputData.StructuralClass) == StructuralClass.S2)
                {
                    this.outputData.MinimumCoverDueToEnvironmentalConditions = 0.015d;
                }
                else if (ConvertStringToStructuralClass(this.outputData.StructuralClass) == StructuralClass.S3)
                {
                    this.outputData.MinimumCoverDueToEnvironmentalConditions = 0.02d;
                }
                else if (ConvertStringToStructuralClass(this.outputData.StructuralClass) == StructuralClass.S4)
                {
                    this.outputData.MinimumCoverDueToEnvironmentalConditions = 0.025d;
                }
                else if (ConvertStringToStructuralClass(this.outputData.StructuralClass) == StructuralClass.S5)
                {
                    this.outputData.MinimumCoverDueToEnvironmentalConditions = 0.03d;
                }
                else if (ConvertStringToStructuralClass(this.outputData.StructuralClass) == StructuralClass.S6)
                {
                    this.outputData.MinimumCoverDueToEnvironmentalConditions = 0.035d;
                }
            }
            // Exposure Class = XC4
            else if (ConvertStringToExposureClass(this.inputData.ExposureClass) == ExposureClass.XC4)
            {
                if (ConvertStringToStructuralClass(this.outputData.StructuralClass) == StructuralClass.S1)
                {
                    this.outputData.MinimumCoverDueToEnvironmentalConditions = 0.015d;
                }
                else if (ConvertStringToStructuralClass(this.outputData.StructuralClass) == StructuralClass.S2)
                {
                    this.outputData.MinimumCoverDueToEnvironmentalConditions = 0.02d;
                }
                else if (ConvertStringToStructuralClass(this.outputData.StructuralClass) == StructuralClass.S3)
                {
                    this.outputData.MinimumCoverDueToEnvironmentalConditions = 0.025d;
                }
                else if (ConvertStringToStructuralClass(this.outputData.StructuralClass) == StructuralClass.S4)
                {
                    this.outputData.MinimumCoverDueToEnvironmentalConditions = 0.03d;
                }
                else if (ConvertStringToStructuralClass(this.outputData.StructuralClass) == StructuralClass.S5)
                {
                    this.outputData.MinimumCoverDueToEnvironmentalConditions = 0.035d;
                }
                else if (ConvertStringToStructuralClass(this.outputData.StructuralClass) == StructuralClass.S6)
                {
                    this.outputData.MinimumCoverDueToEnvironmentalConditions = 0.04d;
                }
            }
            // Exposure Class = XD1 || XS1
            else if (ConvertStringToExposureClass(this.inputData.ExposureClass) == ExposureClass.XD1 || ConvertStringToExposureClass(this.inputData.ExposureClass) == ExposureClass.XS1)
            {
                if (ConvertStringToStructuralClass(this.outputData.StructuralClass) == StructuralClass.S1)
                {
                    this.outputData.MinimumCoverDueToEnvironmentalConditions = 0.02d;
                }
                else if (ConvertStringToStructuralClass(this.outputData.StructuralClass) == StructuralClass.S2)
                {
                    this.outputData.MinimumCoverDueToEnvironmentalConditions = 0.025d;
                }
                else if (ConvertStringToStructuralClass(this.outputData.StructuralClass) == StructuralClass.S3)
                {
                    this.outputData.MinimumCoverDueToEnvironmentalConditions = 0.03d;
                }
                else if (ConvertStringToStructuralClass(this.outputData.StructuralClass) == StructuralClass.S4)
                {
                    this.outputData.MinimumCoverDueToEnvironmentalConditions = 0.035d;
                }
                else if (ConvertStringToStructuralClass(this.outputData.StructuralClass) == StructuralClass.S5)
                {
                    this.outputData.MinimumCoverDueToEnvironmentalConditions = 0.04d;
                }
                else if (ConvertStringToStructuralClass(this.outputData.StructuralClass) == StructuralClass.S6)
                {
                    this.outputData.MinimumCoverDueToEnvironmentalConditions = 0.045d;
                }
            }
            // Exposure Class = XD2 || XS2
            else if (ConvertStringToExposureClass(this.inputData.ExposureClass) == ExposureClass.XD2 || ConvertStringToExposureClass(this.inputData.ExposureClass) == ExposureClass.XS2)
            {
                if (ConvertStringToStructuralClass(this.outputData.StructuralClass) == StructuralClass.S1)
                {
                    this.outputData.MinimumCoverDueToEnvironmentalConditions = 0.025d;
                }
                else if (ConvertStringToStructuralClass(this.outputData.StructuralClass) == StructuralClass.S2)
                {
                    this.outputData.MinimumCoverDueToEnvironmentalConditions = 0.03d;
                }
                else if (ConvertStringToStructuralClass(this.outputData.StructuralClass) == StructuralClass.S3)
                {
                    this.outputData.MinimumCoverDueToEnvironmentalConditions = 0.035d;
                }
                else if (ConvertStringToStructuralClass(this.outputData.StructuralClass) == StructuralClass.S4)
                {
                    this.outputData.MinimumCoverDueToEnvironmentalConditions = 0.04d;
                }
                else if (ConvertStringToStructuralClass(this.outputData.StructuralClass) == StructuralClass.S5)
                {
                    this.outputData.MinimumCoverDueToEnvironmentalConditions = 0.045d;
                }
                else if (ConvertStringToStructuralClass(this.outputData.StructuralClass) == StructuralClass.S6)
                {
                    this.outputData.MinimumCoverDueToEnvironmentalConditions = 0.05d;
                }
            }
            // Exposure Class = XD3 || XS3
            else if (ConvertStringToExposureClass(this.inputData.ExposureClass) == ExposureClass.XD3 || ConvertStringToExposureClass(this.inputData.ExposureClass) == ExposureClass.XS3)
            {
                if (ConvertStringToStructuralClass(this.outputData.StructuralClass) == StructuralClass.S1)
                {
                    this.outputData.MinimumCoverDueToEnvironmentalConditions = 0.03d;
                }
                else if (ConvertStringToStructuralClass(this.outputData.StructuralClass) == StructuralClass.S2)
                {
                    this.outputData.MinimumCoverDueToEnvironmentalConditions = 0.035d;
                }
                else if (ConvertStringToStructuralClass(this.outputData.StructuralClass) == StructuralClass.S3)
                {
                    this.outputData.MinimumCoverDueToEnvironmentalConditions = 0.04d;
                }
                else if (ConvertStringToStructuralClass(this.outputData.StructuralClass) == StructuralClass.S4)
                {
                    this.outputData.MinimumCoverDueToEnvironmentalConditions = 0.045d;
                }
                else if (ConvertStringToStructuralClass(this.outputData.StructuralClass) == StructuralClass.S5)
                {
                    this.outputData.MinimumCoverDueToEnvironmentalConditions = 0.05d;
                }
                else if (ConvertStringToStructuralClass(this.outputData.StructuralClass) == StructuralClass.S6)
                {
                    this.outputData.MinimumCoverDueToEnvironmentalConditions = 0.055d;
                }
            }

            return(this.outputData);
        }