private PolicyBonus[] CalculatePolicyBonus(Policy[] policies, FacebookBonusSettings settings)
        {
            var resultPolicyBonus = new PolicyBonus[policies.Length];
            int count             = 0;
            int total             = 0;
            int temp = 0;

            foreach (Policy policy in SortPoliciesWithConditionSpecifiedInSettings(policies, settings))
            {
                temp = CalculateBonusIntensivePoints(policy.Premium, settings.BonusPercentage);
                var elementPolicyBonus = new PolicyBonus()
                {
                    PolicyNumber  = policy.PolicyNumber,
                    BonusInPoints = temp
                };

                if (IsTotalBiggerThanMaxiumPointAndIsMaxiumBiggerThan0(total + temp, settings.MaximumBonus))
                {
                    temp  = Convert.ToInt32(settings.MaximumBonus) - total;
                    total = Convert.ToInt32(settings.MaximumBonus);
                    elementPolicyBonus.BonusInPoints = temp;
                }
                else
                {
                    total += temp;
                }
                resultPolicyBonus[count] = elementPolicyBonus;
                count++;
            }
            return(resultPolicyBonus);
        }
        private static void Main(string[] args)
        {
            var secondPolicy = new Policy()
            {
                PolicyNumber = "P001", Premium = 200, StartDate = new DateTime(2016, 05, 06)
            };
            var firstPolicy = new Policy()
            {
                PolicyNumber = "P002", Premium = 100, StartDate = new DateTime(2017, 08, 11)
            };
            var thirdPolicy = new Policy()
            {
                PolicyNumber = "P003", Premium = 100, StartDate = new DateTime(2017, 09, 12)
            };

            var settings = new FacebookBonusSettings()
            {
                BonusPercentage = 3,
                MaximumBonus    = 10,
                PolicySorter    = new AscendingOrderOfPoliciesStartDate()
            };

            var calculationInput = new FacebookBonusCalculationInput()
            {
                PoliciesOfCustomer = new Policy[] { firstPolicy, secondPolicy, thirdPolicy },
                Settings           = settings
            };

            var facebookBonusCalculator = new FacebookBonusCalculator();

            FacebookBonus facebookBonus = facebookBonusCalculator.Calculate(calculationInput);
            PolicyBonus   policyBonus   = facebookBonus.PolicyBonuses[0];

            Console.WriteLine(policyBonus.PolicyNumber + " " + policyBonus.BonusInPoints);
            var expectedPolicyBonus = new PolicyBonus()
            {
                PolicyNumber = "P001", BonusInPoints = 6
            };

            Console.WriteLine("\n" + facebookBonus.PolicyBonuses.Contains(expectedPolicyBonus));

            Console.ReadLine();
        }
        /// <summary>
        ///  Calculates the bonus.
        /// </summary>
        /// <param name="input">A parameter object representing inputs to the calculation.</param>
        /// <returns>A <see cref="FacebookBonus"/> object.</returns>
        public virtual FacebookBonus Calculate(FacebookBonusCalculationInput input)
        {
            // TODO: Implement bonus calculation.
            //throw new NotImplementedException();


            var facebookBonusSetting = input.Settings;
            int sumBonusInPoints     = 0;

            var lstPolicies = input.PoliciesOfCustomer.OrderBy(n => n.StartDate);

            List <PolicyBonus> lstPolicyBonuses = new List <PolicyBonus>();

            foreach (var item in lstPolicies)
            {
                float bonusInPoints           = (float)item.Premium * facebookBonusSetting.BonusPercentage;
                int   bonusInPointsAfterFloor = (int)Math.Floor(bonusInPoints);

                sumBonusInPoints += bonusInPointsAfterFloor;
                PolicyBonus policyBonus = new PolicyBonus {
                    PolicyNumber = item.PolicyNumber, BonusInPoints = bonusInPointsAfterFloor
                };
                lstPolicyBonuses.Add(policyBonus);
                if (sumBonusInPoints > facebookBonusSetting.MaximumBonus)
                {
                    var temp = lstPolicyBonuses.ToList();
                    temp.RemoveAt(temp.Count - 1);
                    lstPolicyBonuses.Last().BonusInPoints = (int)facebookBonusSetting.MaximumBonus - temp.Sum(n => n.BonusInPoints);
                    return(new FacebookBonus {
                        PolicyBonuses = lstPolicyBonuses.ToArray()
                    });
                }
            }
            return(new FacebookBonus {
                PolicyBonuses = lstPolicyBonuses.ToArray()
            });
        }