private List <IItem> GetGroups(AssessmentDefinitionDto assessmentDefinitionDto, ItemDefinition itemDefinition, string search, string assessmentName)
        {
            var groups    = new List <IItem> ();
            var questions = new List <IItem> ();

            if (itemDefinition.ItemType != ItemType.Group || itemDefinition.ItemDefinitions == null)
            {
                return(groups);
            }
            var q = GetQuestions(assessmentDefinitionDto, itemDefinition.ItemDefinitions, search, assessmentName);

            questions.AddRange(q);
            if (!q.Any())
            {
                return(groups);
            }
            var group = GetGroup(assessmentDefinitionDto, itemDefinition, q, assessmentName);

            groups.Add(group);
            foreach (var question in q)
            {
                ((Question)question).ParentName = group.Name;
            }

            return(groups);
        }
        private List <IItem> GetQuestions(AssessmentDefinitionDto assessmentDefinitionDto, IEnumerable <ItemDefinition> itemDefinitions, string search, string assessmentName)
        {
            var definitions       = itemDefinitions as ItemDefinition[] ?? itemDefinitions.ToArray();
            var questions         = definitions.Where(a => a.ItemType == ItemType.Question).ToList();
            var subGroupQuestions = definitions
                                    .Where(a => a.ItemType == ItemType.Group)
                                    .SelectMany(b => b.ItemDefinitions)
                                    .Where(c => c.ItemType == ItemType.Question);
            var subGroupInGroupQuestions = definitions
                                           .Where(a => a.ItemType == ItemType.Group)
                                           .Where(g => g.ItemType == ItemType.Group)
                                           .SelectMany(b => b.ItemDefinitions)
                                           .Where(c => c.ItemType == ItemType.Question);

            questions.AddRange(subGroupQuestions);
            questions.AddRange(subGroupInGroupQuestions);
            questions = questions.GroupBy(a => a.CodedConcept.Code).Select(a => a.First()).ToList();
            return((from q in questions
                    let questionName =
                        _resourcesManager.GetResourceManagerByName(assessmentDefinitionDto.AssessmentName)
                        .GetString(SharedStringNames.ResourceKeyPrefix + q.CodedConcept.Code)
                        where IsMatch(search, questionName)
                        select new Question
            {
                ItemType = ItemType.Question.DisplayName,
                Code = q.CodedConcept.Code,
                Name = questionName,
                TemplateName = GetTemplateName(q),
                AssessmentName = assessmentName,
                AssessmentCode = assessmentDefinitionDto.AssessmentCode
            })
                   .Cast <IItem>().OrderBy(a => a.Name).ToList());
        }
        private IItem GetGroup(AssessmentDefinitionDto assessmentDefinitionDto, ItemDefinition itemDefinition, List <IItem> questions, string assessmentName)
        {
            var groupCode = itemDefinition.CodedConcept.Code;
            var assessmentResourceManager = _resourcesManager.GetResourceManagerByName(assessmentDefinitionDto.AssessmentName);

            if (itemDefinition.ItemDefinitions != null)
            {
                var parentGroup = itemDefinition;
                foreach (var id1 in itemDefinition.ItemDefinitions
                         .Where(id1 => id1.ItemDefinitions != null)
                         .Where(id1 => id1.ItemDefinitions.Any(id2 => id2.CodedConcept.Code == questions.ElementAt(0).Code)))
                {
                    parentGroup = id1;
                }
                if (parentGroup != null)
                {
                    groupCode = parentGroup.CodedConcept.Code;
                }
            }
            var groupName = assessmentResourceManager
                            .GetString(SharedStringNames.ResourceKeyPrefix + groupCode + SharedStringNames.ResourceKeyPrefix + SharedStringNames.Instructions)
                            ?? assessmentResourceManager.GetString(SharedStringNames.ResourceKeyPrefix + groupCode);

            var group = new Group
            {
                ItemType       = ItemType.Group.DisplayName,
                Code           = itemDefinition.CodedConcept.Code,
                Name           = groupName,
                Items          = questions,
                AssessmentName = assessmentName,
                AssessmentCode = assessmentDefinitionDto.AssessmentCode
            };

            return(group);
        }