package fi.otavanopisto.muikku.plugins.transcriptofrecords;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.ejb.Stateful;
import javax.enterprise.context.RequestScoped;
import javax.inject.Inject;
import javax.inject.Named;
import org.apache.commons.lang3.StringUtils;
import org.ocpsoft.rewrite.annotation.Join;
import org.ocpsoft.rewrite.annotation.RequestAction;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import fi.otavanopisto.muikku.jsf.NavigationRules;
import fi.otavanopisto.muikku.model.users.UserEntity;
import fi.otavanopisto.muikku.plugins.transcriptofrecords.model.TranscriptOfRecordsFile;
import fi.otavanopisto.muikku.schooldata.GradingController;
import fi.otavanopisto.muikku.schooldata.entity.GradingScale;
import fi.otavanopisto.muikku.schooldata.entity.GradingScaleItem;
import fi.otavanopisto.muikku.session.SessionController;
import fi.otavanopisto.security.LoggedIn;
@Named
@Stateful
@RequestScoped
@Join(path = "/records/", to = "/jsf/records/index.jsf")
@LoggedIn
public class TranscriptofRecordsBackingBean {
@Inject
private Logger logger;
@Inject
private SessionController sessionController;
@Inject
private GradingController gradingController;
@Inject
private TranscriptOfRecordsFileController transcriptOfRecordsFileController;
@RequestAction
public String init() {
if (!sessionController.hasEnvironmentPermission(TranscriptofRecordsPermissions.TRANSCRIPT_OF_RECORDS_VIEW)) {
return NavigationRules.ACCESS_DENIED;
}
Map<String, Grade> grades = new HashMap<>();
List<GradingScale> gradingScales = gradingController.listGradingScales();
for (GradingScale gradingScale : gradingScales) {
List<GradingScaleItem> scaleItems = gradingController.listGradingScaleItems(gradingScale);
for (GradingScaleItem scaleItem : scaleItems) {
String id = StringUtils.join(new String[] {
gradingScale.getSchoolDataSource(),
gradingScale.getIdentifier(),
scaleItem.getSchoolDataSource(),
scaleItem.getIdentifier() }, '-');
String grade = scaleItem.getName();
String scale = gradingScale.getName();
Boolean passing = scaleItem.isPassingGrade();
grades.put(id, new Grade(grade, scale, passing));
}
}
try {
this.grades = new ObjectMapper().writeValueAsString(grades);
} catch (JsonProcessingException e) {
logger.log(Level.SEVERE, "Failed to serialize grades", e);
return NavigationRules.INTERNAL_ERROR;
}
UserEntity loggedEntity = sessionController.getLoggedUserEntity();
List<TranscriptOfRecordsFile> transcriptOfRecordsFiles;
if (loggedEntity != null) {
transcriptOfRecordsFiles = transcriptOfRecordsFileController.listFiles(loggedEntity);
} else {
transcriptOfRecordsFiles = Collections.emptyList();
}
try {
files = new ObjectMapper().writeValueAsString(transcriptOfRecordsFiles);
} catch (JsonProcessingException e) {
logger.log(Level.SEVERE, "Failed to serialize files", e);
return NavigationRules.INTERNAL_ERROR;
}
return null;
}
public String getGrades() {
return grades;
}
public String getFiles() {
return files;
}
private String grades;
private String files;
public static class Grade {
public Grade(String grade, String scale, Boolean passing) {
this.scale = scale;
this.grade = grade;
this.passing = passing;
}
public String getScale() {
return scale;
}
public String getGrade() {
return grade;
}
public Boolean getPassing() {
return passing;
}
private String scale;
private String grade;
private Boolean passing;
}
}