/**
   * Get the approval level for an organisation unit that is required in order for the user to see
   * the data, assuming user is limited to seeing approved data only from lower approval levels.
   *
   * @param orgUnit organisation unit to test.
   * @param user the user.
   * @param approvalLevels all data approval levels.
   * @return required approval level for user to see the data.
   */
  private int requiredApprovalLevel(
      OrganisationUnit orgUnit, User user, List<DataApprovalLevel> approvalLevels) {
    DataApprovalLevel userLevel = getUserApprovalLevel(orgUnit, user, approvalLevels);

    int totalLevels = approvalLevels.size();

    return userLevel == null
        ? 0
        : userLevel.getLevel() == totalLevels
            ? APPROVAL_LEVEL_UNAPPROVED
            : userLevel.getLevel() + 1;
  }
  @Override
  public Map<OrganisationUnit, Integer> getUserReadApprovalLevels(DataApprovalLevel approvalLevel) {
    Map<OrganisationUnit, Integer> map = new HashMap<>();

    User user = currentUserService.getCurrentUser();

    Collection<OrganisationUnit> orgUnits = user.getDataViewOrganisationUnits();

    if (orgUnits == null || orgUnits.isEmpty()) {
      orgUnits = organisationUnitService.getRootOrganisationUnits();
    }

    for (OrganisationUnit orgUnit : orgUnits) {
      map.put(orgUnit, approvalLevel.getLevel());
    }

    return map;
  }
  @Override
  public void deleteDataApprovalLevel(DataApprovalLevel dataApprovalLevel) {
    List<DataApprovalLevel> dataApprovalLevels = getAllDataApprovalLevels();

    int index = dataApprovalLevel.getLevel() - 1;

    if (index >= 0 && index < dataApprovalLevels.size()) {
      dataApprovalLevelStore.delete(dataApprovalLevel);

      dataApprovalLevels.remove(index);

      // Move up from here to end, to avoid duplicate level in database.

      for (int i = index; i < dataApprovalLevels.size(); i++) {
        update(dataApprovalLevels.get(i), i);
      }
    }
  }