private void queryDetailed(
      String client, String login, HttpServletRequest request, HttpServletResponse response)
      throws IOException {

    Set<Long> groupIds = new HashSet<>();
    groupIds.add(
        Group.safeGetByIdOrName(client, ServletUtils.getStrParam(request, "group"))
            .toProp()
            .groupId);
    List<ProgramProp> programProps =
        Program.query(
            client,
            ServletUtils.getIntParam(request, "startYYYYMMDD"),
            ServletUtils.getIntParam(request, "endYYYYMMDD"),
            ServletUtils.getLongParamsAsSet(request, "programTypeId"),
            groupIds,
            null,
            null);

    for (ProgramProp programProp : programProps) {
      programProp.regSummary =
          Registration.getSummary(client, programProp.programId, User.SUPER_USER);
    }

    ServletUtils.setJson(response, new APIResponse().status(Status.SUCCESS).object(programProps));
  }
  private void update(
      String client,
      ProgramProp programProp,
      HttpServletRequest request,
      HttpServletResponse response)
      throws IOException {

    programProp =
        Program.setSpecialInstruction(
            client, programProp.programId, ServletUtils.getStrParam(request, "specialInstruction"));

    List<String> batch1SessionTimings = new ArrayList<>();
    batch1SessionTimings.addAll(ServletUtils.getStringParamsAsSet(request, "batch1SessionTimings"));
    Collections.sort(batch1SessionTimings);

    programProp =
        Program.setSessionTimings(
            client, programProp.programId, batch1SessionTimings, null, null, null, null);

    programProp =
        Program.setMaxParticipants(
            client, programProp.programId, ServletUtils.getIntParam(request, "maxParticipants"));

    programProp =
        Program.setDisabled(
            client, programProp.programId, ServletUtils.getBoolParam(request, "disabled"));

    ServletUtils.setJson(response, new APIResponse().status(Status.SUCCESS).object(programProp));
  }
  private void getAllVenues(
      String client, String login, HttpServletRequest request, HttpServletResponse response)
      throws IOException {

    List<VenueProp> props = Venue.getAll(client);
    ServletUtils.setJson(response, new APIResponse().status(Status.SUCCESS).object(props));
  }
  private void get(
      String client, String login, HttpServletRequest request, HttpServletResponse response)
      throws IOException {

    ProgramProp programProp =
        Program.safeGet(client, ServletUtils.getLongParam(request, "programId")).toProp(client);

    ServletUtils.setJson(response, new APIResponse().status(Status.SUCCESS).object(programProp));
  }
  private void getOngoingSessions(
      String client, String login, HttpServletRequest request, HttpServletResponse response)
      throws IOException {

    List<SessionProp> sessionProps =
        Program.getOngoingSessions(
            client, ServletUtils.getIntParam(request, "dateYYYYMMDD"), login);

    ServletUtils.setJson(response, new APIResponse().status(Status.SUCCESS).object(sessionProps));
  }
  protected void doPost(HttpServletRequest request, HttpServletResponse response)
      throws IOException {

    String client = request.getParameter("client");
    if (client == null) {
      ServletUtils.setJson(
          response, new APIResponse().status(Status.ERROR_RESOURCE_NOT_FULLY_SPECIFIED));
      return;
    }

    String action = request.getParameter("action");
    if (action == null) {
      ServletUtils.setJson(response, new APIResponse().status(Status.ERROR_RESOURCE_NOT_FOUND));
      return;
    }

    String login = ServletUtils.getLogin(request);
    try {
      switch (action) {
        case "getOngoingSessions":
          getOngoingSessions(client, login, request, response);
          break;
        case "query":
          query(client, login, request, response);
          break;
        case "queryDetailed":
          queryDetailed(client, login, request, response);
          break;
        case "get":
          get(client, login, request, response);
          break;
        case "getAllProgramTypes":
          getAllProgramTypes(client, login, request, response);
          break;
        case "getAllPractices":
          getAllPractices(client, login, request, response);
          break;
        case "getAllTeachers":
          getAllTeachers(client, login, request, response);
          break;
        case "getAllVenues":
          getAllVenues(client, login, request, response);
          break;
        case "create":
          create(client, login, request, response);
          break;
        case "update":
          update(client, login, request, response);
          break;
        case "setDisabled":
          setDisabled(client, login, request, response);
          break;
        default:
          ServletUtils.setJson(response, new APIResponse().status(Status.ERROR_RESOURCE_INCORRECT));
      }
    } catch (Exception ex) {
      ServletUtils.setJson(
          response,
          APIUtils.toAPIResponse(
              ex, true, new RequestInfo().client(client).req(request).login(login)));
    }
  }