package model.nonPersistent;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Date;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import model.manager.DrugManager;
import model.manager.PatientSetManager;
import org.celllife.idart.database.hibernate.Drug;
import org.celllife.idart.database.hibernate.Patient;
import org.celllife.idart.database.hibernate.Prescription;
import org.hibernate.Session;
public class AggregateRegimenInfo {
public static Date START_DATE;
public static int UPPER_AGE;
public static int LOWER_AGE;
public static Date END_DATE;
private String drugListString;
private Date prescriptionDate;
private final Set<Integer> drugIdSet;
private final Set<Integer> patientIdSet;
private HashSet<String> regimens;
/**
* 0 - M < LOWER_AGE <br/>
* 1 - M < UPPER_AGE <br/>
* 2 - M >= UPPER_AGE <br/>
* 3 - F < LOWER_AGE <br/>
* 4 - F < UPPER_AGE <br/>
* 5 - F >= UPPER_AG <br/>
* 6 - U < LOWER_AGE <br/>
* 7 - U < UPPER_AGE <br/>
* 8 - U >= UPPER_AG <br/>
* 9 - F < LOWER_AGE (pregnant) <br/>
* 10 - F < UPPER_AGE (pregnant) <br/>
* 11 - F >= UPPER_AG (pregnant) <br/>
*/
private final int[] stats = new int[12];
public AggregateRegimenInfo(Prescription script) {
drugIdSet = new HashSet<Integer>();
patientIdSet = new HashSet<Integer>();
Set<Drug> drugSet = script.getARVDrugSet();
if (!drugSet.isEmpty()) {
List<Drug> drugList = new ArrayList<Drug>();
drugList.addAll(drugSet);
Collections.sort(drugList);
drugListString = DrugManager.getDrugListString(drugList, " + ", true);
for (Drug drug : drugList) {
drugIdSet.add(drug.getId());
}
}
prescriptionDate = script.getDate();
addScript(script);
}
public void addScript(Prescription script) {
Patient patient = script.getPatient();
patientIdSet.add(patient.getId());
int age = patient.getAgeAt(END_DATE);
switch (patient.getSex()) {
case 'M':
updateStats(0, age);
break;
case 'F':
updateStats(3, age);
if (patient.isPregnantAtDate(END_DATE)) {
updateStats(9, age);
}
break;
default:
updateStats(6, age);
}
}
private void updateStats(int i, int age) {
if (age < LOWER_AGE) {
stats[i] += 1;
}
if (age < UPPER_AGE) {
stats[i + 1] += 1;
} else {
stats[i + 2] += 1;
}
}
public String getDrugListString() {
return drugListString;
}
public Set<Integer> getDrugIdSet() {
return drugIdSet;
}
public void addRegimen(String drugGroup) {
if (regimens == null) {
regimens = new HashSet<String>();
}
regimens.add(drugGroup);
}
private String getRegString() {
if (regimens != null && regimens.size() > 0) {
String regString = "";
for (String reg : regimens) {
regString += reg + ";";
}
regString = regString.substring(0, regString.length() - 1) + "";
return regString;
}
return "";
}
@Override
public String toString() {
StringBuilder sb = new StringBuilder();
sb.append(getRegString());
sb.append(",");
sb.append(drugListString);
sb.append(",");
for (int i = 0; i < stats.length; i++) {
sb.append(stats[i]);
sb.append(",");
}
sb.append(stats[1] + stats[2]); // total M
sb.append(",");
sb.append(stats[4] + stats[5]); // total F
sb.append(",");
sb.append(stats[7] + stats[8]); // total U
sb.append("\n");
return sb.toString();
}
public static String getHeaderString(){
String[] headers = getHeaders();
StringBuilder sb = new StringBuilder();
for (int i = 0; i < headers.length; i++) {
sb.append(headers[i]);
if (i< headers.length-1) {
sb.append(",");
}
}
sb.append("\n");
return sb.toString();
}
public static String[] getHeaders() {
return new String[] { "Regimen", "Drug Combo",
"M (< " + LOWER_AGE + ")",
"M (< " + UPPER_AGE + ")", "M (>= " + UPPER_AGE + ")",
"F (< " + LOWER_AGE + ")", "F (< " + UPPER_AGE + ")",
"F (>= " + UPPER_AGE + ")", "U (< " + LOWER_AGE + ")",
"U (< " + UPPER_AGE + ")", "U (>= " + UPPER_AGE + ")",
"Pregnant (< " + LOWER_AGE + ")",
"Pregnant (< " + UPPER_AGE + ")",
"Pregnant (>= " + UPPER_AGE + ")", "Total M", "Total F",
"Total U", };
}
public Set<RegimenInfo> getRegimenInfos(Session session){
List<Patient> patients = PatientSetManager.getPatientsInSet(session, patientIdSet);
Set<RegimenInfo> infos = new HashSet<RegimenInfo>();
for (Patient patient : patients) {
RegimenInfo info = new RegimenInfo();
info.setPatientId(patient.getPatientId());
info.setFirstName(patient.getFirstNames());
info.setLastName(patient.getLastname());
info.setDob(patient.getDateOfBirth());
int age = patient.getAgeAt(END_DATE);
info.setAge(age);
info.setAgeCategory(getAgeCategory(age));
info.setPrescriptionDate(getPrescriptionDate());
info.setSex(patient.getSex());
info.setDrugListString(drugListString);
info.setRegimens(getRegString());
info.setPregnant(patient.isPregnantAtDate(END_DATE));
info.setEpisodeStartReason(patient.getEpisdodeStartReasonInPeriod(
START_DATE, END_DATE));
infos.add(info);
}
return infos;
}
private String getAgeCategory(int age) {
if (age < LOWER_AGE)
return "<" + LOWER_AGE;
else if (age < UPPER_AGE)
return LOWER_AGE + "-" + UPPER_AGE;
else
return ">" + UPPER_AGE;
}
/**
* @return the prescriptionDate
*/
public Date getPrescriptionDate() {
return prescriptionDate;
}
/**
* @param prescriptionDate the prescriptionDate to set
*/
public void setPrescriptionDate(Date prescriptionDate) {
this.prescriptionDate = prescriptionDate;
}
}