/// <summary>
        /// Phương thức kiểm tra xem dã đầy đủ câu trả lời chưa, nếu chưa trả về lỗi, còn không bỏ trống
        /// </summary>
        public string IsFullAnswers()
        {
            if (!Config.IsCheckFullTestPaper)
            {
                return(string.Empty);
            }

            if (!ListeningTestPaper.IsPaperFullSelection())
            {
                return("You have not yet answered all the questions of the Listening test");
            }

            if (!ReadingTestPaper.IsPaperFullSelection())
            {
                return("You have not yet answered all the questions of the Reading test");
            }

            if (!WritingTestPaper.IsPaperFullSelection())
            {
                return("You have not written the Writing Part 2 section");
            }

            if (string.IsNullOrEmpty(WritingTestPaper.WritingPartTwos.UserParagraph))
            {
                return("You have not yet answered all the questions of the Writing test");
            }

            // Đã đầy đủ thì trả về rỗng
            return(string.Empty);
        }
        /// <summary>
        /// Tính toán số điểm
        /// </summary>
        public float ScoreCalculate(ListeningTestPaper paper)
        {
            // Tính điểm cho part 1
            var totalTrue1 = CalculateTrueOfPart(1, paper);

            if (totalTrue1 >= 0)
            {
                Part1Scores = ScoresUtils.ScoresCalculate(totalTrue1, ListeningPartOnes.Count, Config.SCORES_FULL_LISTENING_PART_1);
            }

            // Tính điểm cho part 2
            var totalTrue2 = CalculateTrueOfPart(2, paper);

            if (totalTrue2 >= 0)
            {
                Part2Scores = ScoresUtils.ScoresCalculate(totalTrue2, ListeningPartTwos.Sum(x => x.ListeningBaseQuestions.Count) * ListeningPartTwos.Count, Config.SCORES_FULL_LISTENING_PART_2);
            }

            if (Part1Scores >= 0 && Part2Scores >= 0)
            {
                return(Part1Scores + Part2Scores);
            }
            else
            {
                return(-1);
            }
        }
 public void ClearTrueAnswers()
 {
     ReadingTestPaper.RemoveCorrectAnswers();
     ListeningTestPaper.RemoveCorrectAnswers();
     // Xóa answers writing
     for (int i = 0; i < WritingTestPaper.WritingPartOnes.WritingPart.Count; i++)
     {
         WritingTestPaper.WritingPartOnes.WritingPart[i].Answers = string.Empty;
     }
 }
        /// <summary>
        /// Phương thức tạo bài thi tổng quát
        /// </summary>
        public static GeneralTestPaper Generate(
            TestCategoryManager _TestCategoryManager,
            ReadingPartOneManager _ReadingPartOneManager,
            ReadingPartTwoManager _ReadingPartTwoManager,
            ListeningBaseQuestionManager _ListeningBaseQuestionManager,
            ListeningMediaManager _ListeningMediaManager,
            WritingPartTwoManager _WritingPartTwoManager,
            SpeakingEmbedManager _SpeakingEmbedManager,
            PieceOfTestManager _PieceOfTestManager,
            int UserId,
            int?InstructorId)
        {
            GeneralTestPaper generateTestPaper = new GeneralTestPaper
            {
                // Tạo bài thi Listening
                ListeningTestPaper = new ListeningTestPaper
                {
                    ListeningPartOnes = ListeningTestPaper.Generate(1, _TestCategoryManager, _ListeningMediaManager, _ListeningBaseQuestionManager),
                    ListeningPartTwos = ListeningTestPaper.Generate(2, _TestCategoryManager, _ListeningMediaManager, _ListeningBaseQuestionManager),
                },

                // Kiến tạo danh sách câu hỏi và câu trả lời, đồng thời xáo trộn câu trả lời
                ReadingTestPaper = _TestCategoryManager.GenerateReadingTestPaper(_ReadingPartOneManager, _ReadingPartTwoManager),

                // Kiến tạo danh sách câu hỏi và câu trả lời, đồng thời xáo trộn câu trả lời
                WritingTestPaper = _TestCategoryManager.GenerateWritingTestPaper(_WritingPartTwoManager),

                // Kiến tạo danh sách câu hỏi và câu trả lời, đồng thời xáo trộn câu trả lời
                SpeakingTestPaper = _TestCategoryManager.GenerateSpeakingTestPaper(_SpeakingEmbedManager)
            };

            // Khởi tạo đối tượng lưu trữ bài kiểm tra này và lưu paper mặc định có đáp án đúng vào
            var piceOfTest = new PieceOfTest
            {
                UserId           = UserId,
                InstructorId     = InstructorId,
                TypeCode         = TestCategory.TEST_ALL,
                PartId           = -1,
                ResultOfTestJson = JsonConvert.SerializeObject(generateTestPaper),
                Scores           = -1
            };

            // Lưu trữ bài thi vào database trước khi bắt đầu
            _PieceOfTestManager.Add(piceOfTest);

            // Lưu mã bài thi vào
            generateTestPaper.PieceOfTestId = piceOfTest.Id;

            return(generateTestPaper);
        }
        public void ScoreCalculate(GeneralTestPaper resultPaper)
        {
            // Tính điểm cho Listening
            ListeningTestPaper.ScoreCalculate(resultPaper.ListeningTestPaper);

            // Tính điểm cho READING
            ReadingTestPaper.ScoresCalculate(resultPaper.ReadingTestPaper);

            // Tính điểm cho Writin Part 1
            WritingTestPaper.ScoreCalculate(resultPaper.WritingTestPaper);

            // Điểm tổng phải là -1 kèm WRITING PART 2 và SPEAKING
            WritingTestPaper.WritingPartTwos.Scores = -1;
            SpeakingTestPaper.SpeakingPart.Scores   = -1;
        }
        /// <summary>
        /// Copy những đáp án đã chọn vào trang hiện tại
        /// </summary>
        public ListeningTestPaper CopySelectedAnswers(ListeningTestPaper paper)
        {
            if (paper.ListeningPartOnes == null ||
                ListeningPartOnes == null ||
                ListeningPartOnes.Count <= 0 ||
                paper.ListeningPartOnes.Count != ListeningPartOnes.Count ||
                paper.ListeningPartOnes == null ||
                ListeningPartOnes == null ||
                ListeningPartOnes.Count <= 0 ||
                paper.ListeningPartOnes.Count != ListeningPartOnes.Count)
            {
                return(this);
            }

            // PART 1
            for (int i = 0; i < ListeningPartOnes.Count && i < paper.ListeningPartOnes.Count; i++)
            {
                for (int j = 0; j < ListeningPartOnes[i].ListeningBaseQuestions.Count; j++)
                {
                    var correctIndex = paper.ListeningPartOnes[i].ListeningBaseQuestions[j].AnswerList.FindIndex(0,
                                                                                                                 paper.ListeningPartOnes[i].ListeningBaseQuestions[j].AnswerList.Count, x => x.IsCorrect);
                    if (correctIndex >= 0)
                    {
                        ListeningPartOnes[i].ListeningBaseQuestions[j].AnswerList[correctIndex].IsCorrect = true;
                    }
                }
            }

            // PART 2
            for (int i = 0; i < ListeningPartTwos.Count && i < paper.ListeningPartTwos.Count; i++)
            {
                for (int j = 0; j < ListeningPartTwos[i].ListeningBaseQuestions.Count; j++)
                {
                    var correctIndex = paper.ListeningPartTwos[i].ListeningBaseQuestions[j].AnswerList.FindIndex(0,
                                                                                                                 paper.ListeningPartTwos[i].ListeningBaseQuestions[j].AnswerList.Count, x => x.IsCorrect);
                    if (correctIndex >= 0)
                    {
                        ListeningPartTwos[i].ListeningBaseQuestions[j].AnswerList[correctIndex].IsCorrect = true;
                    }
                }
            }

            return(this);
        }
        /// <summary>
        /// Tính toán số điểm
        /// </summary>
        public float ScoreCalculate(string readingTestPaperJson)
        {
            ListeningTestPaper paper = JsonConvert.DeserializeObject <ListeningTestPaper>(readingTestPaperJson);

            return(ScoreCalculate(paper));
        }
        /// <summary>
        /// Tính số câu đúng theo phần
        /// </summary>
        public int CalculateTrueOfPart(int partId, ListeningTestPaper paper)
        {
            // Khung chứa câu hỏi và câu trả lời
            List <ListeningBaseCombined> currentCombined;
            List <ListeningBaseCombined> destCombined;

            if (partId == 1)
            {
                if (ListeningPartOnes == null ||
                    ListeningPartOnes.Count <= 0 ||
                    paper.ListeningPartOnes == null ||
                    paper.ListeningPartOnes.Count != ListeningPartOnes.Count)
                {
                    return(-1);
                }
                // Gắn kết dữ liệu
                currentCombined = ListeningPartOnes;
                destCombined    = paper.ListeningPartOnes;
            }
            else
            {
                if (ListeningPartTwos == null ||
                    ListeningPartTwos.Count <= 0 ||
                    paper.ListeningPartTwos == null ||
                    paper.ListeningPartTwos.Count != ListeningPartTwos.Count)
                {
                    return(-1);
                }
                // Gắn kết dữ liệu
                currentCombined = ListeningPartTwos;
                destCombined    = paper.ListeningPartTwos;
            }

            // Biến chứa giá trị đếm số câu đúng
            int count = 0;

            // vì chắc chắn 2 cặp dữ liệu trên có size bằng nhau, nên ta tiến hành cho lặp kép
            for (int i = 0; i < currentCombined.Count; i++)
            {
                // Lấy danh sách câu hỏi hiện tại
                List <ListeningBaseQuestion> current = currentCombined[i].ListeningBaseQuestions;
                List <ListeningBaseQuestion> dest    = destCombined[i].ListeningBaseQuestions;

                // Nếu mục hiện tại không có câu hỏi hoặc mục đích có số lượng câu hỏi khác mục hiện tại thì thoát
                if (current != null &&
                    current.Count > 0 &&
                    dest != null &&
                    current.Count == dest.Count)
                {
                    for (int j = 0; j < current.Count; j++)
                    {
                        try
                        {
                            string trueAnswerOfCurrent     = current[j].AnswerList.First(x => x.IsCorrect).AnswerContent;
                            string trueAnswerOfDestination = dest[j].AnswerList.First(x => x.IsCorrect).AnswerContent;
                            if (trueAnswerOfCurrent.ToLower().Trim() == trueAnswerOfDestination.ToLower().Trim())
                            {
                                count++;
                            }
                        }
                        catch (Exception)
                        {
                            // Bỏ qua
                        }
                    }
                }
            }

            return(count);
        }