/**
   * Method is set the attendance dash board dto with selected month and selected class.
   *
   * @param request type HttpServletRequest
   * @param attendanceDashboardDto type AttendanceDashboardDto.
   * @throws AkuraAppException - The exception details that occurred when processing.
   */
  private void setMonthAndClass(
      HttpServletRequest request, AttendanceDashboardDto attendanceDashboardDto)
      throws AkuraAppException {

    int monthId = 0;
    int classId = 0;
    String selectedMonth = request.getParameter(SELECT_MONTHS);
    if (selectedMonth != null && !selectedMonth.equals(AkuraWebConstant.STRING_ZERO)) {
      monthId = Integer.parseInt(selectedMonth);
    }
    attendanceDashboardDto.setMonth(monthId);

    String selectedClass = request.getParameter(SELECT_CLASSES);
    if (selectedClass != null && !selectedClass.equals(AkuraWebConstant.STRING_ZERO)) {

      ClassGrade classGradeObj =
          commonService.findClassGrade(Integer.parseInt(request.getParameter(SELECT_CLASSES)));

      if (classGradeObj != null) {
        classId = classGradeObj.getSchoolClass().getClassId();
      }
      attendanceDashboardDto.setSelectedClassId(Integer.parseInt(selectedClass));
    } else {
      attendanceDashboardDto.setSelectedClassId(classId);
    }

    attendanceDashboardDto.setClassGradeId(classId);
  }
  /**
   * Method is to return GradeClass list.
   *
   * @param request - HttpServletRequest
   * @param modelMap - ModelMap attribute.
   * @return list of classGrade
   * @throws AkuraAppException - Detailed exception
   */
  @RequestMapping(value = ATTENDANCE_GRADE_CLASS_LIST_HTM)
  @ResponseBody
  public String populateGradeClass(ModelMap modelMap, HttpServletRequest request)
      throws AkuraAppException {

    StringBuilder allGradeClass = new StringBuilder();
    int gradeId = Integer.parseInt(request.getParameter(SELECTED_VALUE));
    Grade grade = commonService.findGradeById(gradeId);
    List<ClassGrade> classGrades =
        SortUtil.sortClassGradeList(commonService.getClassGradeListByGrade(grade));
    boolean isFirst = true;
    StringBuilder classes = new StringBuilder();

    for (ClassGrade classGrade : classGrades) {
      classes.append(classGrade.getDescription());
      classes.append(AkuraWebConstant.UNDERSCORE_STRING);
      classes.append(classGrade.getClassGradeId());

      if (isFirst) {
        allGradeClass.append(classes.toString()); // no comma
        isFirst = false;
      } else {
        allGradeClass.append(AkuraWebConstant.STRING_COMMA); // comma
        allGradeClass.append(classes.toString());
      }
      classes.delete(0, classes.length());
    }
    return allGradeClass.toString();
  }
  /**
   * Returns the attendance dash board information with pagination.
   *
   * @param modelMap - a model map contains the data.
   * @param request - request scope data.
   * @param response - response scope data.
   * @param attendanceDashboardDto - AttendanceDashboardDto
   * @return - the name of the view to be redirected.
   * @throws AkuraAppException - The exception details that occurred when processing.
   */
  @RequestMapping(value = ATTENDANCE_PAGINATION, method = RequestMethod.POST)
  public ModelAndView getPagination(
      HttpServletRequest request,
      HttpServletResponse response,
      @ModelAttribute(MODEL_ATT_TEMPLATE) AttendanceDashboardDto attendanceDashboardDto,
      ModelMap modelMap)
      throws AkuraAppException {

    boolean flag = false;
    modelMap.addAttribute(STATUS, Boolean.FALSE);

    String selectedClass = request.getParameter(SELECT_CLASSES);

    if (selectedClass != null) {
      ClassGrade classGradeObj = commonService.findClassGrade(Integer.parseInt(selectedClass));

      if (classGradeObj != null) {
        attendanceDashboardDto.setClassDescription(classGradeObj.getDescription());
      }
    }

    setMonthAndClass(request, attendanceDashboardDto);
    attendanceDashboardDto.setAcademicDays(getAcademicDays(attendanceDashboardDto));
    setSelectedValues(attendanceDashboardDto, modelMap);
    List<BestStudentAttendanceTemplate> bestStudentAttendanceList =
        getBestAttendanceInfoWithPagination(modelMap, request, attendanceDashboardDto, flag);

    if (bestStudentAttendanceList == null) {

      int minNo = attendanceDashboardDto.getMinNo() - PAGINATION_NO;
      attendanceDashboardDto.setMinNo(minNo);
      bestStudentAttendanceList =
          dailyAttendanceService.getTopAttendanceList(attendanceDashboardDto);
      modelMap.addAttribute(STATUS, Boolean.TRUE);
      modelMap.addAttribute(PAGE_MIN_NO, minNo);
    }

    if (bestStudentAttendanceList != null) {
      if (attendanceDashboardDto.isFlag()) {

        modelMap.addAttribute(PAGE_MAX_NO, bestStudentAttendanceList.size() + PAGINATION_NO);
      } else {
        modelMap.addAttribute(PAGE_MAX_NO, bestStudentAttendanceList.size());
      }
    }

    modelMap.addAttribute(BEST_STUDENT_ATTENDANCE_LIST, bestStudentAttendanceList);

    return new ModelAndView(VIEW_ATTENDANCE_DASHBOARD, modelMap);
  }
  /**
   * Handle POST requests for attendance dash board view.
   *
   * @param request - HttpServletRequest
   * @param response - HttpServletResponse
   * @param attendanceDashboardDto - AttendanceDashboardDto
   * @param result - BindingResult
   * @param modelView - ModelAndView
   * @param modelMap - ModelMap
   * @return the name of the view.
   * @throws AkuraAppException - The exception details that occurred when processing.
   */
  @RequestMapping(value = ATTENDANCE_DASHBOARD_HTM, method = RequestMethod.POST)
  public ModelAndView searchAttendanceDashboard(
      HttpServletRequest request,
      HttpServletResponse response,
      @ModelAttribute() AttendanceDashboardDto attendanceDashboardDto,
      BindingResult result,
      ModelAndView modelView,
      ModelMap modelMap)
      throws AkuraAppException {

    // String for error messages.
    String message = null;

    // Set the selected month and class.
    setMonthAndClass(request, attendanceDashboardDto);

    attendanceDashboardValidator.validate(attendanceDashboardDto, result);

    // Check the validations.
    if (result.hasErrors()) {
      return new ModelAndView(VIEW_ATTENDANCE_DASHBOARD, modelMap);

    } else {

      // Get the academic days.
      int academicDays = getAcademicDays(attendanceDashboardDto);
      if (academicDays >= AkuraConstant.TEN) {

        String selectedClass = request.getParameter(SELECT_CLASSES);

        if (selectedClass != null) {
          ClassGrade classGradeObj = commonService.findClassGrade(Integer.parseInt(selectedClass));

          if (classGradeObj != null) {
            attendanceDashboardDto.setClassDescription(classGradeObj.getDescription());
          }
        }

        boolean flag = false;

        attendanceDashboardDto.setAcademicDays(academicDays);
        // Get student attendance list
        List<BestStudentAttendanceTemplate> bestStudentAttendanceList =
            getBestAttendanceInfoWithPagination(modelMap, request, attendanceDashboardDto, flag);

        if (bestStudentAttendanceList != null) {
          if (!bestStudentAttendanceList.isEmpty()) {
            modelMap.addAttribute(BEST_STUDENT_ATTENDANCE_LIST, bestStudentAttendanceList);
          } else {
            message = new ErrorMsgLoader().getErrorMessage(NOT_MINIMUM_ATTENDANCE_ERROR);
          }
        } else {
          message = new ErrorMsgLoader().getErrorMessage(NO_DATA_ERROR_MESSAGE);
        }
      } else {
        message = new ErrorMsgLoader().getErrorMessage(WORKING_DAYS_ERROR);
      }

      setSelectedValues(attendanceDashboardDto, modelMap);
      modelMap.addAttribute(MODEL_ATT_MESSAGE, message);
      modelMap.addAttribute(MODEL_ATT_ATTENDANCE_DASHBOARD, attendanceDashboardDto);
    }

    return new ModelAndView(VIEW_ATTENDANCE_DASHBOARD, modelMap);
  }