private RuleHandlerSettings InnerCreate(TypiconRule rule, IEnumerable <DayWorship> dayWorships, OktoikhDay oktoikhDay,
                                         GetRuleSettingsRequest req, RuleHandlerSettings additionalSettings, int?signNumber = null)
 {
     return(new RuleHandlerSettings()
     {
         Addition = additionalSettings,
         Date = req.Date,
         Rule = rule,
         DayWorships = dayWorships.ToList(),
         OktoikhDay = oktoikhDay,
         Language = LanguageSettingsFactory.Create(req.Language),
         SignNumber = signNumber,
         //ThrowExceptionIfInvalid = req.ThrowExceptionIfInvalid,
         ApplyParameters = req.ApplyParameters,
         CheckParameters = req.CheckParameters
     });
 }
        private RuleHandlerSettings GetRecursiveSettings(TypiconRule rule, IEnumerable <DayWorship> dayWorships, OktoikhDay oktoikhDay,
                                                         GetRuleSettingsRequest req, RuleHandlerSettings additionalSettings, int?signNumber = null)
        {
            RuleHandlerSettings outputSettings = InnerCreate(rule, dayWorships, oktoikhDay, req, additionalSettings, signNumber);

            /*
             * Если Правило имеет:
             *      Правило помечено как Дополнение
             *      и определен Шаблон
             */

            if (/*string.IsNullOrEmpty(rule.RuleDefinition) && */ rule.IsAddition && rule.Template != null)
            {
                //если правило определено и определено как добавление, входим в рекурсию
                outputSettings = GetRecursiveSettings(rule.Template, dayWorships, oktoikhDay, req, outputSettings);
            }

            return(outputSettings);
        }
        /// <summary>
        /// Формирует запрос для дальнейшей обработки: главную и второстепенную службу, HandlingMode
        /// Процесс описан в документации
        /// </summary>
        /// <param name="req"></param>
        /// <returns></returns>
        public virtual RuleHandlerSettings Create(GetRuleSettingsRequest req)
        {
            //MenologyRule - не может быть null
            if (req.MenologyRule == null)
            {
                throw new NullReferenceException("MenologyRule");
            }
            //находим день Октоиха - не может быть null
            if (req.OktoikhDay == null)
            {
                throw new NullReferenceException("OktoikhDay");
            }

            //находим TriodionRule
            //TriodionRule triodionRule = req.Typicon.GetTriodionRule(req.Date);

            //находим ModifiedRule с максимальным приоритетом
            //ModifiedRule modifiedRule = _modifiedRuleService.GetModifiedRuleHighestPriority(req.Typicon, req.Date);

            //создаем выходной объект
            RuleHandlerSettings settings = null;

            //Номер Знака службы, указанный в ModifiedRule, который будет использовать в отображении Расписания
            int?signNumber = null;

            if (req.ModifiedRule != null)
            {
                //custom SignNumber
                signNumber = req.ModifiedRule.SignNumber;

                if (req.ModifiedRule.IsAddition == true)
                {
                    //создаем первый объект, который в дальнейшем станет ссылкой Addition у выбранного правила
                    settings = InnerCreate(req.ModifiedRule.RuleEntity, req.ModifiedRule.RuleEntity.DayWorships, req.OktoikhDay, req, null);

                    //обнуляем его, чтобы больше не участвовал в формировании
                    req.ModifiedRule = null;
                }
            }

            //получаем главное Правило и коллекцию богослужебных текстов
            (DayRule Rule, IEnumerable <DayWorship> Worships) = CalculatePriorities(req.ModifiedRule, req.MenologyRule, req.TriodionRule);

            //смотрим, не созданы ли уже настройки
            if (settings != null)
            {
                //созданы - значит был определен элемент для добавления
                settings.DayWorships.AddRange(Worships);
            }


            TypiconRule seniorRule = Rule;

            //смотрим, главным ставить само Правило или Знак службы

            /*
             * Если Правило имеет:
             *      пустое RuleDefinition
             *      //и Правило помечено как Дополнение
             *      и определен Шаблон
             */
            if (
                string.IsNullOrEmpty(Rule.RuleDefinition) &&
                Rule.IsAddition &&
                Rule.Template != null
                )
            {
                seniorRule = seniorRule.Template;
            }

            RuleHandlerSettings outputSettings = GetRecursiveSettings(seniorRule, Worships, req.OktoikhDay, req, settings, signNumber);

            return(outputSettings);
        }