package gov.nysenate.openleg.model.spotcheck.daybreak;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.time.LocalDate;
import java.util.*;
/**
* This class encapsulates a set of daybreak documents that have not yet been grouped into reports
* Daybreak documents are fed individually into a DaybreakReportSet object and grouped into reports.
* Once all documents are fed in, complete reports, partial reports and duplicate documents can be retrieved
*/
public class DaybreakReportSet<DaybreakDoc extends DaybreakDocument> {
Logger logger = LoggerFactory.getLogger(DaybreakReportSet.class);
/** Stores any generated reports */
private Set<DaybreakReport<DaybreakDoc> > reportSet;
/** Stores any Documents that have been found to be of the same type and report date as a document in an existing report */
private List<DaybreakDoc> duplicateDocuments;
/** --- Constructors --- */
public DaybreakReportSet(){
reportSet = new HashSet<>();
duplicateDocuments = new LinkedList<>();
}
/** --- Functional Getters/Setters */
/**
* Takes in a daybreak document and attempts to fit it into a report.
* Files the document as a duplicate if a document with the same report date and type is found
* @param daybreakDoc
*/
public void insertDaybreakDocument(DaybreakDoc daybreakDoc){
for(DaybreakReport<DaybreakDoc> daybreakReport : reportSet){
try{
daybreakReport.insertDaybreakDoc(daybreakDoc);
return;
}
catch (DaybreakReport.DaybreakReportInsertException ex) {
// Insert the document into the duplicate list if it was found to be a duplicate
if(ex.getInsertExceptionReason() ==
DaybreakReport.DaybreakReportInsertException.InsertExceptionReason.REPORT_CONTAINS_TYPE){
logger.error("Duplicate document detected for report-" + daybreakReport + " type-" +
daybreakDoc.getDaybreakDocType() + "" + daybreakDoc);
duplicateDocuments.add(daybreakDoc);
return;
}
}
}
// If it is not a fit or a duplicate, create a new report
reportSet.add(new DaybreakReport<>(daybreakDoc));
}
/**
* Returns all reports that are complete
* @return
*/
public Map<LocalDate, DaybreakReport<DaybreakDoc>> getCompleteReports() {
Map<LocalDate, DaybreakReport<DaybreakDoc>> completeReports = new HashMap<>();
for(DaybreakReport<DaybreakDoc> daybreakReport : reportSet){
if(daybreakReport.isComplete()){
completeReports.put(daybreakReport.getReportDate(), daybreakReport);
}
}
return completeReports;
}
/**
* Returns all reports that are not yet complete
* @return
*/
public Map<LocalDate, DaybreakReport<DaybreakDoc>> getPartialReports() {
Map<LocalDate, DaybreakReport<DaybreakDoc>> partialReports = new HashMap<>();
for(DaybreakReport<DaybreakDoc> daybreakReport : reportSet){
if(!daybreakReport.isComplete()){
partialReports.put(daybreakReport.getReportDate(), daybreakReport);
}
}
return partialReports;
}
/** --- Getters/Setters --- */
public List<DaybreakDoc> getDuplicateDocuments() {
return duplicateDocuments;
}
}