public void UpdateCourses(StudyProject studyProject, StudyCourse newStudyCourse)
        {
            if (studyProject == null)
            {
                throw new ArgumentException("Argument 'studyProject' is null");
            }

            if (newStudyCourse == null)
            {
                throw new ArgumentException("Argument 'newStudyCourse' is null");
            }

            bool foundCourse = false;

            foreach (var studyCourse in studyProject.Courses)
            {
                if (studyCourse.TreeId == newStudyCourse.TreeId)
                {
                    foundCourse = true;

                    studyCourse.CourseName      = newStudyCourse.CourseName;
                    studyCourse.BackgroundColor = newStudyCourse.BackgroundColor;
                }
            }

            // Add course to project if not exists
            if (!foundCourse)
            {
                studyProject.Courses.Add(newStudyCourse);
            }
        }
        public static StudyProject Clone(this StudyProject studyProject)
        {
            // Simplest and stupidest way - just serialize and deserialize.
            // It works, so who gives a damn.
            string serializedXml      = studyProject.Serialize();
            var    clonedStudyProject = serializedXml.Deserialize <StudyProject>();

            return(clonedStudyProject);
        }
        public static StudyCourse GetCourseByTreeId(this StudyProject studyProject, string treeId)
        {
            if (String.IsNullOrEmpty(treeId))
            {
                throw new ArgumentException("Argument 'treeId' is null or empty");
            }

            return(studyProject.Courses.FirstOrDefault(e => e.TreeId.Equals(treeId)));
        }
        public StudyProject CreateStudyProject(string name, string parentId)
        {
            if (String.IsNullOrEmpty(name))
            {
                throw new ArgumentException("Argument 'name' is null or empty");
            }

            var studyProject = new StudyProject();

            if (!String.IsNullOrEmpty(parentId))
            {
                // Create from existing project.
                var existingStudyProject = StudyManager.Instance.GetStudyProject(parentId);
                if (existingStudyProject != null)
                {
                    studyProject = existingStudyProject.Clone();
                }
                else
                {
                    throw new NullReferenceException("Specified parent study project does not exist!");
                }
            }
            else
            {
                // Populate with courses
                foreach (var course in SettingManager.Instance.AvailableStudyCourses)
                {
                    UpdateCourses(studyProject, course);
                }

                // Populate with groups
                foreach (var group in SettingManager.Instance.AvailableStudyGroups)
                {
                    UpdateGroups(studyProject, group);
                }
            }

            studyProject.Id              = Guid.NewGuid().ToString("N");
            studyProject.Name            = name;
            studyProject.CreationDate    = DateTime.Now;
            studyProject.LastUpdatedDate = DateTime.Now;
            studyProject.FileName        = Guid.NewGuid().ToString("N") + ".xml";

            // Add to list
            StudyProjects.Add(studyProject);

            // Initial save to file
            FileManager.SaveObjectToFile(studyProject, FileManager.DataPath, studyProject.FileName);

            return(studyProject);
        }
        private void DeleteStudyProjectFile(StudyProject studyProject)
        {
            if (studyProject == null)
            {
                throw new ArgumentException("Argument 'studyProject' is null");
            }

            if (String.IsNullOrEmpty(studyProject.FileName))
            {
                throw new Exception($"Study project '{studyProject.Id}' name is empty!");
            }

            string fullFilePath = AppDomain.CurrentDomain.BaseDirectory + FileManager.DataPath + studyProject.FileName;

            FileManager.DeleteFile(fullFilePath);
        }
        public void UpdateGroups(StudyProject studyProject, StudyGroup newStudyGroup)
        {
            if (studyProject == null)
            {
                throw new ArgumentException("Argument 'studyProject' is null");
            }

            if (newStudyGroup == null)
            {
                throw new ArgumentException("Argument 'newStudyGroup' is null");
            }

            foreach (var studyCourse in studyProject.Courses)
            {
                UpdateGroups(studyCourse, newStudyGroup);
            }
        }
        public void UpdateStudies(StudyProject studyProject, Study newStudy)
        {
            if (studyProject == null)
            {
                throw new ArgumentException("Argument 'studyProject' is null");
            }

            if (newStudy == null)
            {
                throw new ArgumentException("Argument 'newStudy' is null");
            }

            foreach (var studyCourse in studyProject.Courses)
            {
                UpdateStudies(studyCourse, newStudy);
            }
        }
        public static StudyGroup GetGroupByTreeId(this StudyProject studyProject, string treeId)
        {
            if (String.IsNullOrEmpty(treeId))
            {
                throw new ArgumentException("Argument 'treeId' is null or empty");
            }

            foreach (var course in studyProject.Courses)
            {
                foreach (var group in course.Groups)
                {
                    if (group.TreeId.Equals(treeId))
                    {
                        return(group);
                    }
                }
            }

            return(null);
        }
        public Study GetStudy(StudyProject studyProject, string treeId)
        {
            if (String.IsNullOrEmpty(treeId))
            {
                throw new ArgumentException("Argument 'treeId' is null or empty");
            }

            if (studyProject == null)
            {
                return(null);
            }

            Study study = null;

            lock (_locker)
            {
                study = FindStudyByTreeId(studyProject, treeId);
            }

            return(study);
        }
        public Study FindStudyByTreeId(StudyProject studyProject, string treeId)
        {
            if (studyProject == null)
            {
                throw new ArgumentException("Argument 'studyProject' is null");
            }

            if (String.IsNullOrEmpty(treeId))
            {
                throw new Exception("Argument 'treeId' is null or empty!");
            }

            foreach (var studyCourse in studyProject.Courses)
            {
                var study = FindStudyByTreeId(studyCourse, treeId);

                if (study != null)
                {
                    return(study);
                }
            }

            return(null);
        }
        public static List <StudyInfoMessage> CheckStudyProject(StudyProject studyProject)
        {
            var messages = new List <StudyInfoMessage>();

            if (studyProject != null)
            {
                int totalOfClass10 = 0;
                int totalOfClass11 = 0;
                int totalOfClass12 = 0;

                bool obligatoryStudiesNotFilled = false;
                bool minimalStudyCountNotMet    = false;
                bool tooManyCreditsInStudy      = false;
                bool parentStudiesNotFilledIn   = false;

                var groupStudyCount = new Dictionary <string, int>();

                foreach (var course in studyProject.Courses)
                {
                    foreach (var group in course.Groups)
                    {
                        if (!groupStudyCount.ContainsKey(group.TreeId))
                        {
                            groupStudyCount.Add(group.TreeId, 0);
                        }

                        int countByGroup = 0;

                        foreach (var study in group.Studies)
                        {
                            totalOfClass10 += study.CreditPoints[0];
                            totalOfClass11 += study.CreditPoints[1];
                            totalOfClass12 += study.CreditPoints[2];

                            if (study.CreditPoints[0] == 0 &&
                                study.CreditPoints[1] == 0 &&
                                study.CreditPoints[2] == 0
                                )
                            {
                                if (study.IsObligatory)
                                {
                                    obligatoryStudiesNotFilled = true;

                                    messages.Add(
                                        new StudyInfoMessage
                                    {
                                        SeverityLevel = SeverityLevel.Warning,
                                        TreeId        = study.TreeId
                                    });
                                }
                            }
                            else
                            {
                                countByGroup++;

                                // Check parent studies not filled in.
                                if (!String.IsNullOrEmpty(study.ParentTreeId))
                                {
                                    var parentStudy = StudyManager.Instance.GetStudy(studyProject, study.ParentTreeId);

                                    if (parentStudy != null &&
                                        parentStudy.CreditPoints[0] == 0 &&
                                        parentStudy.CreditPoints[1] == 0 &&
                                        parentStudy.CreditPoints[2] == 0)
                                    {
                                        parentStudiesNotFilledIn = true;

                                        messages.Add(
                                            new StudyInfoMessage
                                        {
                                            SeverityLevel = SeverityLevel.Error,
                                            TreeId        = study.TreeId
                                        });

                                        messages.Add(
                                            new StudyInfoMessage
                                        {
                                            SeverityLevel = SeverityLevel.Error,
                                            TreeId        = parentStudy.TreeId
                                        });
                                    }
                                }

                                // Check credit point total in all years.
                                if (study.CreditPointLimit > 0 &&
                                    study.CreditPoints[0]
                                    + study.CreditPoints[1]
                                    + study.CreditPoints[2] > study.CreditPointLimit)
                                {
                                    tooManyCreditsInStudy = true;

                                    messages.Add(
                                        new StudyInfoMessage
                                    {
                                        SeverityLevel = SeverityLevel.Error,
                                        TreeId        = study.TreeId
                                    });
                                }
                            }
                        }

                        groupStudyCount[group.TreeId] += countByGroup;
                    }
                }

                // Check for minimal study count in group.
                foreach (var groupPair in groupStudyCount)
                {
                    var group = SettingManager.Instance.GetGroupByTreeId(groupPair.Key);
                    if (group != null)
                    {
                        if (group.MinimalStudyCount > groupPair.Value)
                        {
                            minimalStudyCountNotMet = true;
                            messages.Add(
                                new StudyInfoMessage
                            {
                                SeverityLevel = SeverityLevel.Warning,
                                TreeId        = groupPair.Key
                            });
                        }
                    }
                }

                // Check totals by each class - must be between CreditPointMinimum and CreditPointMaximum.
                if (totalOfClass10 < CreditPointMinimum ||
                    totalOfClass11 < CreditPointMinimum ||
                    totalOfClass12 < CreditPointMinimum)
                {
                    string additionalInfo = String.Empty;

                    additionalInfo += " " + (totalOfClass10 < CreditPointMinimum ? "10;" : String.Empty);
                    additionalInfo += " " + (totalOfClass11 < CreditPointMinimum ? "11;" : String.Empty);
                    additionalInfo += " " + (totalOfClass12 < CreditPointMinimum ? "12;" : String.Empty);

                    messages.Add(
                        new StudyInfoMessage
                    {
                        SeverityLevel  = SeverityLevel.Error,
                        Message        = "errors.notEnoughCreditPointsInYear",
                        AdditionalInfo = additionalInfo.Trim()
                    });
                }

                if (totalOfClass10 > CreditPointMaximum ||
                    totalOfClass11 > CreditPointMaximum ||
                    totalOfClass12 > CreditPointMaximum)
                {
                    string additionalInfo = String.Empty;

                    additionalInfo += " " + (totalOfClass10 > CreditPointMaximum ? "10;" : String.Empty);
                    additionalInfo += " " + (totalOfClass11 > CreditPointMaximum ? "11;" : String.Empty);
                    additionalInfo += " " + (totalOfClass12 > CreditPointMaximum ? "12;" : String.Empty);

                    messages.Add(
                        new StudyInfoMessage
                    {
                        SeverityLevel  = SeverityLevel.Error,
                        Message        = "errors.tooManyCreditPointsInYear",
                        AdditionalInfo = additionalInfo.Trim()
                    });
                }

                // Check for obligatory studies not filled in.
                if (obligatoryStudiesNotFilled)
                {
                    messages.Add(
                        new StudyInfoMessage
                    {
                        SeverityLevel = SeverityLevel.Warning,
                        Message       = "errors.obligatoryStudiesNotFilled"
                    });
                }

                // Check for minimal study count in group.
                if (minimalStudyCountNotMet)
                {
                    messages.Add(
                        new StudyInfoMessage
                    {
                        SeverityLevel = SeverityLevel.Warning,
                        Message       = "errors.groupMinimalStudyCountNotMet"
                    });
                }

                // Check credit point total in all years.
                if (tooManyCreditsInStudy)
                {
                    messages.Add(
                        new StudyInfoMessage
                    {
                        SeverityLevel = SeverityLevel.Error,
                        Message       = "errors.tooManyCreditPointsInStudy"
                    });
                }

                // Check parent studies not filled in.
                if (parentStudiesNotFilledIn)
                {
                    messages.Add(
                        new StudyInfoMessage
                    {
                        SeverityLevel = SeverityLevel.Error,
                        Message       = "errors.parentStudiesNotFilled"
                    });
                }
            }

            return(messages);
        }