private IEnumerable <WorkPatternRepresentation> CombineWeeklyPatternsIntoMonthlyOnes(
            List <WorkPatternRepresentation> weeklyPatterns)
        {
            DaysInMonth.ToString();
            WorkdaysInMonth.ToString();

            var patternValidator = new WorkPatternValidator(new List <BusinessRule>());
            var monthlyPatterns  = new List <WorkPatternRepresentation>();
            var random           = new Random();

            foreach (var weeklyPattern in weeklyPatterns)
            {
                var monthlyPattern = weeklyPattern;
                // just consider 5 weekly patterns will cover the month
                // (normally, we should find the first multiple of 5 larger than WorkDaysInMonth)
                // TODO the Times() extension method would be useful here
                for (var count = 0; count < 5; count += 1)
                {
                    var randomIndex       = random.Next(0, weeklyPatterns.Count);
                    var randomNextPattern = weeklyPatterns.ElementAt(randomIndex);

                    var candidateForExtendedPattern = new WorkPatternRepresentation(
                        monthlyPattern.Concat(randomNextPattern));

                    while (!patternValidator.Validate(candidateForExtendedPattern))
                    {
                        randomIndex       = random.Next(0, weeklyPatterns.Count);
                        randomNextPattern = weeklyPatterns.ElementAt(randomIndex);

                        candidateForExtendedPattern = new WorkPatternRepresentation(
                            monthlyPattern.Concat(randomNextPattern));
                    }

                    // TODO as a safety measure, the above loop should be forcefully
                    // exited if it has been looping for a large number of times

                    monthlyPattern = candidateForExtendedPattern;
                }

                monthlyPatterns.Add(monthlyPattern);
            }

            return(monthlyPatterns);
        }