package us.mn.state.health.lims.reports.action.implementation;
import net.sf.jasperreports.engine.JRDataSource;
import net.sf.jasperreports.engine.data.JRBeanCollectionDataSource;
import org.apache.commons.validator.GenericValidator;
import us.mn.state.health.lims.analysis.dao.AnalysisDAO;
import us.mn.state.health.lims.analysis.daoimpl.AnalysisDAOImpl;
import us.mn.state.health.lims.analysis.valueholder.Analysis;
import us.mn.state.health.lims.common.services.ReportTrackingService;
import us.mn.state.health.lims.common.services.StatusService;
import us.mn.state.health.lims.common.services.TestService;
import us.mn.state.health.lims.common.services.StatusService.AnalysisStatus;
import us.mn.state.health.lims.common.util.DateUtil;
import us.mn.state.health.lims.common.util.StringUtil;
import us.mn.state.health.lims.dictionary.dao.DictionaryDAO;
import us.mn.state.health.lims.dictionary.daoimpl.DictionaryDAOImpl;
import us.mn.state.health.lims.dictionary.valueholder.Dictionary;
import us.mn.state.health.lims.reports.action.implementation.reportBeans.VLReportData;
import us.mn.state.health.lims.result.dao.ResultDAO;
import us.mn.state.health.lims.result.daoimpl.ResultDAOImpl;
import us.mn.state.health.lims.result.valueholder.Result;
import us.mn.state.health.lims.sampleorganization.dao.SampleOrganizationDAO;
import us.mn.state.health.lims.sampleorganization.daoimpl.SampleOrganizationDAOImpl;
import us.mn.state.health.lims.sampleorganization.valueholder.SampleOrganization;
import java.sql.Date;
import java.sql.Timestamp;
import java.util.ArrayList;
import java.util.List;
public abstract class PatientVLReport extends RetroCIPatientReport {
protected static final long YEAR = 1000L * 60L * 60L * 24L * 365L;
protected static final long THREE_YEARS = YEAR * 3L;
protected static final long WEEK = YEAR / 52L;
protected static final long MONTH = YEAR / 12L;
protected List<VLReportData> reportItems;
private String invalidValue = StringUtil.getMessageForKey("report.test.status.inProgress");
protected void initializeReportItems() {
reportItems = new ArrayList<VLReportData>();
}
protected String getReportNameForReport() {
return StringUtil.getMessageForKey("reports.label.patient.VL");
}
public JRDataSource getReportDataSource() throws IllegalStateException {
if (!initialized) {
throw new IllegalStateException("initializeReport not called first");
}
return errorFound ? new JRBeanCollectionDataSource(errorMsgs) : new JRBeanCollectionDataSource(reportItems);
}
protected void createReportItems() {
VLReportData data = new VLReportData();
setPatientInfo(data);
setTestInfo(data);
reportItems.add(data);
}
protected void setTestInfo(VLReportData data) {
boolean atLeastOneAnalysisNotValidated = false;
AnalysisDAO analysisDAO = new AnalysisDAOImpl();
List<Analysis> analysisList = analysisDAO.getAnalysesBySampleId(reportSample.getId());
// DictionaryDAO dictionaryDAO = new DictionaryDAOImpl();
Timestamp lastReport = new ReportTrackingService().getTimeOfLastNamedReport(reportSample, ReportTrackingService.ReportType.PATIENT, requestedReport);
Boolean mayBeDuplicate = lastReport != null;
ResultDAO resultDAO = new ResultDAOImpl();
Date maxCompleationDate = null;
long maxCompleationTime = 0L;
// String invalidValue = StringUtil.getMessageForKey("report.test.status.inProgress");
for (Analysis analysis : analysisList) {
if (analysis.getCompletedDate() != null) {
if (analysis.getCompletedDate().getTime() > maxCompleationTime) {
maxCompleationDate = analysis.getCompletedDate();
maxCompleationTime = maxCompleationDate.getTime();
}
}
String testName = TestService.getUserLocalizedTestName( analysis.getTest() );
List<Result> resultList = resultDAO.getResultsByAnalysis(analysis);
boolean valid = ANALYSIS_FINALIZED_STATUS_ID.equals(analysis.getStatusId());
if (!valid) {
atLeastOneAnalysisNotValidated = true;
}
if (testName.equals("Viral Load")) {
if (valid) {
// data.setShowVirologie(Boolean.TRUE);
String resultValue = "";
if( resultList.size() > 0){
resultValue = resultList.get( resultList.size() - 1).getValue();
}
String baseValue = resultValue;
if(!GenericValidator.isBlankOrNull(resultValue) && resultValue.contains("(")){
String[] splitValue = resultValue.split("\\(");
data.setAmpli2(splitValue[0]);
baseValue = splitValue[0];
}else{
data.setAmpli2(resultValue);
}
if(!GenericValidator.isBlankOrNull(baseValue) && !"0".equals(baseValue)){
try{
double viralLoad = Double.parseDouble(baseValue);
data.setAmpli2lo(String.format("%.3g%n", Math.log10(viralLoad)));
}catch(NumberFormatException nfe){
data.setAmpli2lo("");
}
}
}
}
if( mayBeDuplicate &&
StatusService.getInstance().matches( analysis.getStatusId(), AnalysisStatus.Finalized) &&
lastReport.before(analysis.getLastupdated())){
mayBeDuplicate = false;
}
}
if (maxCompleationDate != null) {
data.setCompleationdate(DateUtil.convertSqlDateToStringDate(maxCompleationDate));
}
data.setDuplicateReport(mayBeDuplicate);
data.setStatus(atLeastOneAnalysisNotValidated ? StringUtil.getMessageForKey("report.status.partial") : StringUtil
.getMessageForKey("report.status.complete"));
}
protected void setPatientInfo(VLReportData data) {
SampleOrganizationDAO orgDAO = new SampleOrganizationDAOImpl();
data.setSubjectno(reportPatient.getNationalId());
data.setSitesubjectno(reportPatient.getExternalId());
data.setBirth_date(reportPatient.getBirthDateForDisplay());
data.setAge(DateUtil.getCurrentAgeForDate(reportPatient.getBirthDate(), reportSample.getCollectionDate()));
data.setGender(reportPatient.getGender());
data.setCollectiondate( DateUtil.convertTimestampToStringDateAndTime(reportSample.getCollectionDate()));
SampleOrganization sampleOrg = new SampleOrganization();
sampleOrg.setSample(reportSample);
orgDAO.getDataBySample(sampleOrg);
data.setServicename(sampleOrg.getId() == null ? "" : sampleOrg.getOrganization().getOrganizationName());
data.setDoctor(getObservationValues(OBSERVATION_DOCTOR_ID));
data.setAccession_number(reportSample.getAccessionNumber());
data.setReceptiondate( DateUtil.convertTimestampToStringDateAndTime(reportSample.getReceivedTimestamp()));
Timestamp collectionDate = reportSample.getCollectionDate();
if (collectionDate != null) {
long collectionTime = collectionDate.getTime() - reportPatient.getBirthDate().getTime();
if (collectionTime < THREE_YEARS) {
data.setAgeWeek(String.valueOf((int) Math.floor(collectionTime / WEEK)));
} else {
data.setAgeMonth(String.valueOf((int) Math.floor(collectionTime / MONTH)));
}
}
data.getSampleQaEventItems(reportSample);
}
protected String getProjectId() {
return ANTIRETROVIRAL_STUDY_ID+":"+ANTIRETROVIRAL_FOLLOW_UP_STUDY_ID+":"+VL_STUDY_ID;
//return ANTIRETROVIRAL_ID;
}
}