package gov.samhsa.consent2share.domain.clinicaldata;
import gov.samhsa.consent2share.domain.patient.PatientDataOnDemand;
import gov.samhsa.consent2share.domain.reference.BodySiteCodeDataOnDemand;
import gov.samhsa.consent2share.domain.reference.MedicationStatusCodeDataOnDemand;
import gov.samhsa.consent2share.domain.reference.ProductFormCodeDataOnDemand;
import gov.samhsa.consent2share.domain.reference.RouteCodeDataOnDemand;
import gov.samhsa.consent2share.domain.reference.UnitOfMeasureCode;
import gov.samhsa.consent2share.domain.valueobject.CodedConcept;
import gov.samhsa.consent2share.domain.valueobject.Quantity;
import java.security.SecureRandom;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.Iterator;
import java.util.List;
import java.util.Random;
import javax.validation.ConstraintViolation;
import javax.validation.ConstraintViolationException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Configurable;
import org.springframework.data.domain.PageRequest;
import org.springframework.stereotype.Component;
@Component
@Configurable
public class MedicationDataOnDemand {
private Random rnd = new SecureRandom();
private List<Medication> data;
@Autowired
BodySiteCodeDataOnDemand bodySiteCodeDataOnDemand;
@Autowired
MedicationStatusCodeDataOnDemand medicationStatusCodeDataOnDemand;
@Autowired
PatientDataOnDemand patientDataOnDemand;
@Autowired
ProductFormCodeDataOnDemand productFormCodeDataOnDemand;
@Autowired
RouteCodeDataOnDemand routeCodeDataOnDemand;
@Autowired
MedicationRepository medicationRepository;
public Medication getNewTransientMedication(int index) {
Medication obj = new Medication();
setMedicationInformationCode(obj, index);
setDoseQuantity(obj, index);
setFreeTextSig(obj, index);
setMedicationEndDate(obj, index);
setMedicationStartDate(obj, index);
return obj;
}
public void setMedicationInformationCode(Medication obj, int index) {
CodedConcept embeddedClass = new CodedConcept();
setMedicationInformationCodeCode(embeddedClass, index);
setMedicationInformationCodeCodeSystem(embeddedClass, index);
setMedicationInformationCodeDisplayName(embeddedClass, index);
setMedicationInformationCodeCodeSystemName(embeddedClass, index);
setMedicationInformationCodeOriginalText(embeddedClass, index);
obj.setMedicationInformationCode(embeddedClass);
}
public void setMedicationInformationCodeCode(CodedConcept obj, int index) {
String code = "code_" + index;
if (code.length() > 250) {
code = code.substring(0, 250);
}
obj.setCode(code);
}
public void setMedicationInformationCodeCodeSystem(CodedConcept obj, int index) {
String codeSystem = "codeSystem_" + index;
if (codeSystem.length() > 250) {
codeSystem = codeSystem.substring(0, 250);
}
obj.setCodeSystem(codeSystem);
}
public void setMedicationInformationCodeDisplayName(CodedConcept obj, int index) {
String displayName = "displayName_" + index;
if (displayName.length() > 250) {
displayName = displayName.substring(0, 250);
}
obj.setDisplayName(displayName);
}
public void setMedicationInformationCodeCodeSystemName(CodedConcept obj, int index) {
String codeSystemName = "codeSystemName_" + index;
if (codeSystemName.length() > 250) {
codeSystemName = codeSystemName.substring(0, 250);
}
obj.setCodeSystemName(codeSystemName);
}
public void setMedicationInformationCodeOriginalText(CodedConcept obj, int index) {
String originalText = "originalText_" + index;
if (originalText.length() > 250) {
originalText = originalText.substring(0, 250);
}
obj.setOriginalText(originalText);
}
public void setDoseQuantity(Medication obj, int index) {
Quantity embeddedClass = new Quantity();
setDoseQuantityMeasuredValue(embeddedClass, index);
setDoseQuantityUnitOfMeasureCode(embeddedClass, index);
obj.setDoseQuantity(embeddedClass);
}
public void setDoseQuantityMeasuredValue(Quantity obj, int index) {
Double measuredValue = new Integer(index).doubleValue();
obj.setMeasuredValue(measuredValue);
}
public void setDoseQuantityUnitOfMeasureCode(Quantity obj, int index) {
UnitOfMeasureCode unitOfMeasureCode = null;
obj.setUnitOfMeasureCode(unitOfMeasureCode);
}
public void setFreeTextSig(Medication obj, int index) {
String freeTextSig = "freeTextSig_" + index;
if (freeTextSig.length() > 250) {
freeTextSig = freeTextSig.substring(0, 250);
}
obj.setFreeTextSig(freeTextSig);
}
public void setMedicationEndDate(Medication obj, int index) {
Date medicationEndDate = new GregorianCalendar(Calendar.getInstance().get(Calendar.YEAR), Calendar.getInstance().get(Calendar.MONTH), Calendar.getInstance().get(Calendar.DAY_OF_MONTH), Calendar.getInstance().get(Calendar.HOUR_OF_DAY), Calendar.getInstance().get(Calendar.MINUTE), Calendar.getInstance().get(Calendar.SECOND) + new Double(Math.random() * 1000).intValue()).getTime();
obj.setMedicationEndDate(medicationEndDate);
}
public void setMedicationStartDate(Medication obj, int index) {
Date medicationStartDate = new GregorianCalendar(Calendar.getInstance().get(Calendar.YEAR), Calendar.getInstance().get(Calendar.MONTH), Calendar.getInstance().get(Calendar.DAY_OF_MONTH), Calendar.getInstance().get(Calendar.HOUR_OF_DAY), Calendar.getInstance().get(Calendar.MINUTE), Calendar.getInstance().get(Calendar.SECOND) + new Double(Math.random() * 1000).intValue()).getTime();
obj.setMedicationStartDate(medicationStartDate);
}
public Medication getSpecificMedication(int index) {
init();
if (index < 0) {
index = 0;
}
if (index > (data.size() - 1)) {
index = data.size() - 1;
}
Medication obj = data.get(index);
Long id = obj.getId();
return medicationRepository.findOne(id);
}
public Medication getRandomMedication() {
init();
Medication obj = data.get(rnd.nextInt(data.size()));
Long id = obj.getId();
return medicationRepository.findOne(id);
}
public boolean modifyMedication(Medication obj) {
return false;
}
public void init() {
int pageNumber = 0;
int pageSize = 10;
data = medicationRepository.findAll(
new PageRequest(pageNumber, pageSize)).getContent();
if (data == null) {
throw new IllegalStateException("Find entries implementation for 'Medication' illegally returned null");
}
if (!data.isEmpty()) {
return;
}
data = new ArrayList<Medication>();
for (int i = 0; i < 10; i++) {
Medication obj = getNewTransientMedication(i);
try {
medicationRepository.save(obj);
} catch (ConstraintViolationException e) {
StringBuilder msg = new StringBuilder();
for (Iterator<ConstraintViolation<?>> iter = e.getConstraintViolations().iterator(); iter.hasNext();) {
ConstraintViolation<?> cv = iter.next();
msg.append("[").append(cv.getConstraintDescriptor()).append(":").append(cv.getMessage()).append("=").append(cv.getInvalidValue()).append("]");
}
throw new RuntimeException(msg.toString(), e);
}
medicationRepository.flush();
data.add(obj);
}
}
}