package org.webcat.outcomesmeasurement.reports;
import java.util.Calendar;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
import com.webobjects.appserver.WOComponent;
import com.webobjects.appserver.WOContext;
import com.webobjects.appserver.WOResponse;
import com.webobjects.foundation.NSArray;
import com.webobjects.foundation.NSMutableArray;
import org.webcat.core.CourseOffering;
import org.webcat.core.Semester;
import org.webcat.outcomesmeasurement.Coursework;
import org.webcat.outcomesmeasurement.MeasureOfOffering;
import org.webcat.outcomesmeasurement.OutcomePair;
import org.webcat.outcomesmeasurement.OutcomePairStatistic;
import org.webcat.outcomesmeasurement.StudentAnswer;
@SuppressWarnings("serial")
public class SemesterReportsPage extends BaseReportsPage {
public String reportType;
public String newReportType;
public Semester currSemester;
public NSArray<Semester> allSems;
public Semester aSem;
public SemesterReportsPage(WOContext context) {
super(context);
if (reportType == null) reportType = "outcomePairs";
allSems = Semester.allObjects(localContext());
currSemester = findMostRecentCompleted(allSems);
}
public WOComponent switchSemester(){
currSemester = aSem;
return null;
}
@Override
public void appendToResponse(WOResponse response, WOContext context) {
if (allSems.count() > 0){
NSArray<CourseOffering> offerings = CourseOffering.objectsMatchingQualifier(localContext(), CourseOffering.semester.eq(currSemester));
outcomePairStats = new NSMutableArray<OutcomePairStatistic>();
NSArray<Coursework> allCoursework = Coursework.objectsMatchingQualifier(localContext(), Coursework.courseOffering.in(offerings).and(Coursework.outcomePair.isNotNull()));
if (reportType.equals("measures")){
NSArray<MeasureOfOffering> measures = MeasureOfOffering.objectsMatchingQualifier(localContext(), MeasureOfOffering.courseOffering.in(offerings));
outcomePairStats = getStatsForMeasures(measures);
} else if (reportType.equals("outcomePairs")){
outcomePairStats = getStatsForCoursework(allCoursework);
}
}
super.appendToResponse(response, context);
}
private NSMutableArray<OutcomePairStatistic> getStatsForCoursework(
NSArray<Coursework> allCoursework) {
Map<OutcomePair, OutcomePairStatistic> opMap = new HashMap<OutcomePair, OutcomePairStatistic>();
NSMutableArray<OutcomePairStatistic> retVal = new NSMutableArray<OutcomePairStatistic>();
for (Coursework cw : allCoursework){
OutcomePair pair = cw.outcomePair();
if (!opMap.containsKey(pair)){
OutcomePairStatistic tempStat = new OutcomePairStatistic();
tempStat.setOutcomePair(pair);
opMap.put(pair, tempStat);
}
OutcomePairStatistic opStat = opMap.get(pair);
NSArray<StudentAnswer> answers = cw.studentAnswers();
for (StudentAnswer answer: answers){
Double percent = answer.percentEarned();
if (percent != null){
percent = percent * 100;
if (percent.compareTo(Double.valueOf(opStat.getExcellentCutoff())) >= 0){
opStat.incrementExcellent();
} else if (percent.compareTo(Double.valueOf(opStat.getAdequateCutoff())) >= 0){
opStat.incrementAdequate();
} else {
opStat.incrementUnsatisfactory();
}
}
}
opMap.put(pair, opStat);
}
Set<OutcomePair> keySet = opMap.keySet();
for (OutcomePair op : keySet){
OutcomePairStatistic ops = opMap.get(op);
if (ops.getTotalNumber() > 0) retVal.add(ops);
}
return retVal;
}
private NSMutableArray<OutcomePairStatistic> getStatsForMeasures(NSArray<MeasureOfOffering> measures){
NSMutableArray<OutcomePairStatistic> retVal = new NSMutableArray<OutcomePairStatistic>();
// for (MeasureOfOffering off : measures){
// Integer excellent = off.excellent();
// Integer adequate = off.adequate();
// Integer unsatisfactory = off.unsatisfactory();
// off.ex
// NSArray<OutcomePair> pairs = off.measure().outcomePairs();
//
// }
return retVal;
}
private Semester findMostRecentCompleted(NSArray<Semester> semesters){
Semester retVal = null;
for (Semester sem : semesters){
if (sem.semesterEndDate().compareTo(Calendar.getInstance().getTime()) > 0) continue;
if (retVal == null) retVal = sem;
else {
if (sem.semesterEndDate().compare(retVal.semesterEndDate()) > 0) retVal = sem;
}
}
return retVal;
}
}