public async Task <IActionResult> Edit(int?courseId, int?subjectId)
        {
            if (courseId == null || subjectId == null)
            {
                TempData["Error"] = MESSAGE_NOT_FOUND;
                return(RedirectToAction(nameof(Index)));
            }
            var res = new MarksUpSertDTO
            {
                Marks = await(from s in _context.Students
                              join m in _context.Markses.Where(m => m.SubjectID == subjectId) on s.ID equals m.StudentID
                              into p from m in p.DefaultIfEmpty()
                              join c in _context.Courses on s.CourseID equals c.ID
                              into q
                              from c in q.DefaultIfEmpty()
                              where c.ID == courseId && s.Status == 1 && s.Deleted != 1
                              select new MarksSelectDTO
                {
                    StudentID   = s.ID,
                    StudentName = s.Name,
                    StudentCode = s.Code,
                    Score       = m.Score,
                    Status      = m.Status
                }).ToListAsync(),
                Subject = await(from s in _context.Subjects
                                where s.ID == subjectId && s.Deleted != 1
                                select new SubjectSelectDTO
                {
                    ID   = s.ID,
                    Name = s.Name
                }).FirstOrDefaultAsync(),
                CourseID  = courseId,
                SubjectID = subjectId
            };

            return(View(res));
        }
        public async Task <ActionResult> EditMark(MarksUpSertDTO req)
        {
            try
            {
                var markses       = JsonSerializer.Deserialize <List <Marks> >(req.MarkJson);
                var markExistList = await(from m in _context.Markses
                                          join s in _context.Students on m.StudentID equals s.ID
                                          into p
                                          from s in p.DefaultIfEmpty()
                                          join c in _context.Courses on s.CourseID equals c.ID
                                          into q
                                          from c in q.DefaultIfEmpty()
                                          where c.ID == req.CourseID && m.SubjectID == req.SubjectID
                                          select m).ToListAsync();

                if (markExistList.Count == 0)
                {
                    foreach (var m in markses)
                    {
                        m.SubjectID = req.SubjectID;
                        if (m.Score != null && m.Score >= 8)
                        {
                            m.Status = 1;
                        }
                        else if (m.Score != null && m.Score < 8)
                        {
                            m.Status = 0;
                        }
                    }
                    await _context.AddRangeAsync(markses);
                }
                else
                {
                    var newMarks = new List <Marks>();
                    foreach (var m in markses)
                    {
                        var marksExist = markExistList.FirstOrDefault(d => d.StudentID == m.StudentID);
                        if (marksExist != null)
                        {
                            marksExist.Score = m.Score;
                            if (m.Score != null && m.Score >= 8)
                            {
                                marksExist.Status = 1;
                            }
                            else if (m.Score != null && m.Score < 8)
                            {
                                marksExist.Status = 0;
                            }
                            _context.Update(marksExist);
                        }
                        else
                        {
                            m.SubjectID = req.SubjectID;
                            if (m.Score != null && m.Score >= 8)
                            {
                                m.Status = 1;
                            }
                            else if (m.Score != null && m.Score < 8)
                            {
                                m.Status = 0;
                            }

                            newMarks.Add(m);
                        }
                    }
                    await _context.AddRangeAsync(newMarks);
                }

                var std = _context.Students.Where(s => s.Deleted != 1 && s.Status == (int)Student.StudentStatus.Admission &&
                                                  s.Marks.Where(m => m.Status == (int)Marks.MarksStatus.Pass).Count() == s.Course.CourseSubject.Count())
                          .ToList();
                std.ForEach(s => s.Status = (int)Student.StudentStatus.Graduating);



                await _context.SaveChangesAsync();

                return(Json(new { status = true, message = MESSAGE_SUCCESS }));
            }
            catch (Exception ex)
            {
                return(Json(new { status = false, message = ex.Message }));
            }
        }
        // GET: Admin/Marks/Details/5
        public async Task <IActionResult> Details(int?courseId, int?subjectId)
        {
            if (courseId == null || subjectId == null)
            {
                TempData["Error"] = MESSAGE_NOT_FOUND;
                return(RedirectToAction(nameof(Index)));
            }
            var res = new MarksUpSertDTO();

            switch (UserLogin.Role)
            {
            case ConstantVariables.ROLE_FACULTY:
                var faculty = _context.Faculties.FirstOrDefault(f => f.Deleted != 1 && f.UserID == UserLogin.ID);
                if (_context.CourseSubjects.Any(cs => cs.CourseID == courseId && cs.SubjectID == subjectId && cs.FacultyID == faculty.ID))
                {
                    res.Marks = await(from s in _context.Students
                                      join m in _context.Markses on s.ID equals m.StudentID
                                      into p
                                      from m in p.DefaultIfEmpty()
                                      join c in _context.Courses on s.CourseID equals c.ID
                                      into q
                                      from c in q.DefaultIfEmpty()
                                      where c.ID == courseId && s.Status == 1 && s.Deleted != 1
                                      select new MarksSelectDTO
                    {
                        StudentID   = s.ID,
                        StudentName = s.Name,
                        Score       = m.Score,
                        Status      = m.Status
                    }).ToListAsync();
                    res.Subject = await(from s in _context.Subjects
                                        where s.ID == subjectId && s.Deleted != 1
                                        select new SubjectSelectDTO
                    {
                        ID   = s.ID,
                        Name = s.Name
                    }).FirstOrDefaultAsync();
                }
                break;

            case ConstantVariables.ROLE_STUDENT:
                var student = _context.Students.FirstOrDefault(f => f.Deleted != 1 && f.UserID == UserLogin.ID);

                if (student.CourseID == courseId)
                {
                    res.Marks = await(from s in _context.Students
                                      join m in _context.Markses on s.ID equals m.StudentID
                                      into p
                                      from m in p.DefaultIfEmpty()
                                      join c in _context.Courses on s.CourseID equals c.ID
                                      into q
                                      from c in q.DefaultIfEmpty()
                                      where c.ID == courseId && s.Status == 1 && s.Deleted != 1
                                      select new MarksSelectDTO
                    {
                        StudentID   = s.ID,
                        StudentName = s.Name,
                        Score       = m.Score,
                        Status      = m.Status
                    }).ToListAsync();
                    res.Subject = await(from s in _context.Subjects
                                        where s.ID == subjectId && s.Deleted != 1
                                        select new SubjectSelectDTO
                    {
                        ID   = s.ID,
                        Name = s.Name
                    }).FirstOrDefaultAsync();
                }
                break;

            default:
                res.Marks = await(from s in _context.Students
                                  join m in _context.Markses on s.ID equals m.StudentID
                                  into p
                                  from m in p.DefaultIfEmpty()
                                  join c in _context.Courses on s.CourseID equals c.ID
                                  into q
                                  from c in q.DefaultIfEmpty()
                                  where c.ID == courseId && s.Status == 1 && s.Deleted != 1
                                  select new MarksSelectDTO
                {
                    StudentID   = s.ID,
                    StudentName = s.Name,
                    StudentCode = s.Code,
                    Score       = m.Score,
                    Status      = m.Status
                }).ToListAsync();
                res.Subject = await(from s in _context.Subjects
                                    where s.ID == subjectId && s.Deleted != 1
                                    select new SubjectSelectDTO
                {
                    ID   = s.ID,
                    Name = s.Name
                }).FirstOrDefaultAsync();

                break;
            }

            return(View(res));
        }