/**
   * Processamento das mensagens através da execução da operação correspondente. Geração de uma
   * mensagem de resposta.
   *
   * @param request mensagem com o pedido e (eventualmente) os parâmetros necessários para a
   *     realização da operação requerida sobre o monitor
   * @return mensagem de resposta
   * @throws MessageRequestException
   */
  @Override
  public Response processAndReply(Request request) throws MessageRequestException {
    Response response;
    int passageiroId = 0;
    switch (request.getMethodName()) {
      case GO_HOME:
        if (request.getArgs().length != 1)
          throw new MessageRequestException(
              "Formato do request GO_HOME inválido: " + "espera-se 1 parametro!", request);
        passageiroId = (int) request.getArgs()[0];
        if (passageiroId < 0 || passageiroId >= passMax)
          throw new MessageRequestException("Id do passageiro inválido!", request);
        transicao.goHome(passageiroId);
        break;

      case PREPARE_NEXT_LEG:
        if (request.getArgs().length != 1)
          throw new MessageRequestException(
              "Formato do request PREPARE_NEXT_LEG inválido: " + "espera-se 1 parametro!", request);
        passageiroId = (int) request.getArgs()[0];
        if (passageiroId < 0 || passageiroId >= passMax)
          throw new MessageRequestException("Id do passageiro inválido!", request);
        transicao.prepareNextLeg(passageiroId);
        break;
      case BAGAGEIRO_DONE:
        System.out.println("Bagageiro acabou!(ServerInterface)");
        transicao.bagageiroDone();
        break;
      case SHUTDOWN_MONITOR:
        return new Response(OK, request.getSerial(), transicao.shutdownMonitor());
      default:
        throw new MessageRequestException("Tipo de request inválido!", request);
    }
    return new Response(OK, request.getSerial(), null);
  }