public MessageStatus scheduleMessage(MessageRequest message, String content) {
    if ((message.getRecipientNumber() == null || message.getRecipientNumber().isEmpty())
        && !ContactNumberType.PUBLIC.toString().equals(message.getPhoneNumberType())) {
      return MessageStatus.REJECTED;
    }

    MessageRequestDAO msgReqDao = coreManager.createMessageRequestDAO();

    msgReqDao.save(message);

    // TODO Check length of message and break if necessary
    logger.info("Constructing GatewayRequest...");
    GatewayRequest gwReq = storeManager.constructMessage(message, null);
    gwReq.setMessage(content);
    gwReq.getGatewayRequestDetails().setMessage(content);

    logger.info("Initializing OMP MessagingService...");
    MessagingService msgSvc = ompManager.createMessagingService();

    logger.info("Scheduling GatewayRequest...");

    msgSvc.scheduleMessage(gwReq);

    logger.info("Updating MessageRequest...");
    message.setDateProcessed(new Date());
    message.setStatus(MStatus.PENDING);
    logger.debug(message);

    msgReqDao.save(message);
    logger.info("Messages sent successfully");
    return MessageStatus.valueOf(message.getStatus().toString());
  }
  public MessageStatus sendMessage(MessageRequest message) {
    if ((message.getRecipientNumber() == null || message.getRecipientNumber().isEmpty())
        && !ContactNumberType.PUBLIC.toString().equals(message.getPhoneNumberType())) {
      return MessageStatus.REJECTED;
    }

    Language defaultLanguage = coreManager.createLanguageDAO().getByCode(defaultLang);

    if (message.getLanguage() == null) {
      message.setLanguage(defaultLanguage);
    }

    MessageRequestDAO msgReqDao = coreManager.createMessageRequestDAO();

    message.setStatus(MStatus.QUEUED);
    msgReqDao.save(message);

    logger.debug("Constructing GatewayRequest...");
    GatewayRequest gwReq = storeManager.constructMessage(message, defaultLanguage);
    message.setGatewayRequestDetails(null);

    logger.debug("Initializing OMP MessagingService...");
    MessagingService msgSvc = ompManager.createMessagingService();

    logger.info("Sending GatewayRequest...");

    Map<Boolean, Set<GatewayResponse>> responses = msgSvc.sendMessage(gwReq);

    Boolean falseBool = false;
    if (responses.containsKey(falseBool)) {
      Set<GatewayResponse> resps = responses.get(falseBool);
      for (GatewayResponse gp : resps) {
        statHandler.handleStatus(gp);
      }
    }

    logger.info("Updating MessageRequest...");
    message.setGatewayRequestDetails(gwReq.getGatewayRequestDetails());
    message.setDateProcessed(new Date());
    message.setStatus(MStatus.PENDING);
    logger.debug(message);

    msgReqDao.save(message);

    logger.info("Messages sent successfully");
    return MessageStatus.valueOf(message.getStatus().toString());
  }
  @Transactional(readOnly = true)
  public void processMessageRetries() {
    MessageRequestDAO msgReqDao = coreManager.createMessageRequestDAO();
    List<MessageRequest> messages =
        msgReqDao.getMsgRequestByStatusAndTryNumber(MStatus.RETRY, maxTries);

    if (messages == null || messages.isEmpty()) {
      logger.info("No message request to retry");
      return;
    }
    logger.info("Fetched " + messages.size() + " message requests for retry");

    logger.info("Processing messages...");
    for (MessageRequest message : messages) {
      try {
        processMessageRetry(message);
      } catch (Exception e) {
        logger.error("Error while retrying message requests: ", e);
      }
    }

    logger.info("Messages processed successfully");
  }
  @Transactional(readOnly = true)
  public void processMessageRequests() {
    MessageRequestDAO msgReqDao = coreManager.createMessageRequestDAO();

    List<MessageRequest> messages = msgReqDao.getMsgByStatus(MStatus.QUEUED);

    int numMsgs = (messages == null) ? 0 : messages.size();
    logger.info("MessageRequest fetched: " + numMsgs);
    logger.debug(messages);

    Language defaultLanguage = coreManager.createLanguageDAO().getByCode(defaultLang);

    logger.info("Building GatewayRequests...");
    for (MessageRequest message : messages) {
      try {
        processMessageRequest(message, defaultLanguage);
      } catch (Exception e) {
        logger.error("Error while processing message requests: ", e);
      }
    }

    logger.info("Messages processed successfully");
  }
  public MessageStatus savePatientMessageRequest(
      String messageId,
      NameValuePair[] personalInfo,
      String patientNumber,
      ContactNumberType patientNumberType,
      String langCode,
      MediaType messageType,
      Long notificationType,
      Date startDate,
      Date endDate,
      String recipientId) {
    logger.debug("Constructing MessageRequest object...");

    if (patientNumberType == ContactNumberType.PUBLIC && messageType == MediaType.TEXT) {
      return MessageStatus.REJECTED;
    }

    if ((patientNumber == null || patientNumber.isEmpty())
        && patientNumberType != ContactNumberType.PUBLIC) {
      return MessageStatus.REJECTED;
    }

    MessageRequest messageRequest = coreManager.createMessageRequest();

    NotificationTypeDAO noteTypeDao = coreManager.createNotificationTypeDAO();
    NotificationType noteType = (NotificationType) noteTypeDao.getById(notificationType);

    Language langObject = coreManager.createLanguageDAO().getByCode(langCode);

    if (personalInfo != null) {
      HashSet<NameValuePair> details = new HashSet<NameValuePair>();
      details.addAll(Arrays.asList(personalInfo));
      messageRequest.setPersInfos(details);
    }

    messageRequest.setTryNumber(1);
    messageRequest.setRequestId(messageId);
    // VOICE messages need to have a start date to accommodate replaying DELIVERED messages
    messageRequest.setDateFrom(
        startDate == null && messageType == MediaType.VOICE ? new Date() : startDate);
    messageRequest.setDateTo(endDate);
    messageRequest.setRecipientNumber(patientNumber);
    messageRequest.setPhoneNumberType(patientNumberType.toString());
    messageRequest.setRecipientId(recipientId);
    messageRequest.setNotificationType(noteType);
    messageRequest.setMessageType(MessageType.valueOf(messageType.toString()));
    messageRequest.setLanguage(langObject);
    messageRequest.setStatus(MStatus.QUEUED);
    messageRequest.setDateCreated(new Date());

    logger.debug("MessageRequest object successfully constructed");
    logger.debug(messageRequest);

    if (messageRequest.getDateFrom() == null && messageRequest.getDateTo() == null) {
      return sendMessage(messageRequest);
    }

    logger.info("Saving MessageRequest...");
    MessageRequestDAO msgReqDao = coreManager.createMessageRequestDAO();

    msgReqDao.save(messageRequest);
    return MessageStatus.valueOf(messageRequest.getStatus().toString());
  }
  public MessageStatus saveCHPSMessageRequest(
      String messageId,
      NameValuePair[] personalInfo,
      String workerNumber,
      Patient[] patientList,
      String langCode,
      MediaType messageType,
      Long notificationType,
      Date startDate,
      Date endDate) {
    logger.info("Constructing MessageDetails object...");

    if (workerNumber == null || workerNumber.isEmpty()) {
      return MessageStatus.REJECTED;
    }

    MessageRequest messageRequest = coreManager.createMessageRequest();

    NotificationTypeDAO noteTypeDao = coreManager.createNotificationTypeDAO();
    NotificationType noteType = (NotificationType) noteTypeDao.getById(notificationType);

    Language langObject = coreManager.createLanguageDAO().getByCode(langCode);

    HashSet<NameValuePair> details = new HashSet<NameValuePair>();
    if (personalInfo != null) {
      details.addAll(Arrays.asList(personalInfo));
    }
    if (patientList != null) {
      for (Patient p : patientList) {
        if (p.getPreferredName() != null) {
          details.add(new NameValuePair("PreferredName", p.getPreferredName()));
        }
        if (p.getLastName() != null) {
          details.add(new NameValuePair("LastName", p.getLastName()));
        }
        if (p.getCommunity() != null) {
          details.add(new NameValuePair("Community", p.getCommunity()));
        }
        if (p.getFirstName() != null) {
          details.add(new NameValuePair("FirstName", p.getFirstName()));
        }
        if (p.getMotechId() != null) {
          details.add(new NameValuePair("MotechId", p.getMotechId()));
        }
        if (p.getPhoneNumber() != null) {
          details.add(new NameValuePair("PhoneNumber", p.getPhoneNumber()));
        }
      }
    }
    messageRequest.setPersInfos(details);

    messageRequest.setTryNumber(1);
    messageRequest.setRequestId(messageId);
    messageRequest.setDateFrom(startDate);
    messageRequest.setDateTo(endDate);
    messageRequest.setRecipientNumber(workerNumber);
    messageRequest.setNotificationType(noteType);
    messageRequest.setMessageType(MessageType.valueOf(messageType.toString()));
    messageRequest.setLanguage(langObject);
    messageRequest.setStatus(MStatus.QUEUED);
    messageRequest.setDateCreated(new Date());

    logger.info("MessageRequest object successfully constructed");
    logger.debug(messageRequest);

    if (messageRequest.getDateFrom() == null && messageRequest.getDateTo() == null) {
      return sendMessage(messageRequest);
    }

    logger.info("Saving MessageRequest...");
    MessageRequestDAO msgReqDao = coreManager.createMessageRequestDAO();

    msgReqDao.save(messageRequest);

    return MessageStatus.valueOf(messageRequest.getStatus().toString());
  }