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());
  }