package fi.otavanopisto.pyramus.rest.controller;
import java.util.Date;
import java.util.List;
import javax.ejb.Stateless;
import javax.enterprise.context.Dependent;
import javax.inject.Inject;
import fi.otavanopisto.pyramus.dao.grading.CourseAssessmentDAO;
import fi.otavanopisto.pyramus.dao.grading.CourseAssessmentRequestDAO;
import fi.otavanopisto.pyramus.domainmodel.courses.Course;
import fi.otavanopisto.pyramus.domainmodel.courses.CourseStudent;
import fi.otavanopisto.pyramus.domainmodel.grading.CourseAssessment;
import fi.otavanopisto.pyramus.domainmodel.grading.CourseAssessmentRequest;
import fi.otavanopisto.pyramus.domainmodel.grading.Grade;
import fi.otavanopisto.pyramus.domainmodel.students.Student;
import fi.otavanopisto.pyramus.domainmodel.users.StaffMember;
@Stateless
@Dependent
public class AssessmentController {
@Inject
private CourseAssessmentDAO courseAssessmentDAO;
@Inject
private CourseAssessmentRequestDAO courseAssessmentRequestDAO;
public CourseAssessment createCourseAssessment(CourseStudent courseStudent, StaffMember assessingUser, Grade grade, Date date, String verbalAssessment){
// Create course assessment (reusing archived, if any)...
CourseAssessment courseAssessment = courseAssessmentDAO.findByCourseStudent(courseStudent);
if (courseAssessment != null) {
courseAssessment = courseAssessmentDAO.update(courseAssessment, assessingUser, grade, date, verbalAssessment, Boolean.FALSE);
}
else {
courseAssessment = courseAssessmentDAO.create(courseStudent, assessingUser, grade, date, verbalAssessment);
}
// ...and mark respective course assessment requests as handled
List<CourseAssessmentRequest> courseAssessmentRequests = courseAssessmentRequestDAO.listByCourseStudent(courseStudent);
for (CourseAssessmentRequest courseAssessmentRequest : courseAssessmentRequests) {
courseAssessmentRequestDAO.updateHandled(courseAssessmentRequest, Boolean.TRUE);
}
return courseAssessment;
}
public CourseAssessment updateCourseAssessment(CourseAssessment courseAssessment, StaffMember assessingUser, Grade grade, Date assessmentDate, String verbalAssessment){
// Update course assessment...
courseAssessment = courseAssessmentDAO.update(courseAssessment, assessingUser, grade, assessmentDate, verbalAssessment, courseAssessment.getArchived());
// ...and mark respective course assessment requests as handled
List<CourseAssessmentRequest> courseAssessmentRequests = courseAssessmentRequestDAO.listByCourseStudent(courseAssessment.getCourseStudent());
for (CourseAssessmentRequest courseAssessmentRequest : courseAssessmentRequests) {
courseAssessmentRequestDAO.updateHandled(courseAssessmentRequest, Boolean.TRUE);
}
return courseAssessment;
}
public CourseAssessment findCourseAssessmentById(Long id){
return courseAssessmentDAO.findById(id);
}
public CourseAssessment findCourseAssessmentByCourseStudentAndArchived(CourseStudent courseStudent, Boolean archived) {
return courseAssessmentDAO.findByCourseStudentAndArchived(courseStudent, archived);
}
public List<CourseAssessment> listByStudent(Student student){
return courseAssessmentDAO.listByStudent(student);
}
public List<CourseAssessment> listByCourseAndStudent(Course course, Student student){
return courseAssessmentDAO.listByStudentAndCourse(student, course);
}
public void deleteCourseAssessment(CourseAssessment courseAssessment) {
courseAssessmentDAO.archive(courseAssessment);
}
public CourseAssessmentRequest createCourseAssessmentRequest(CourseStudent courseStudent, Date created, String requestText) {
return courseAssessmentRequestDAO.create(courseStudent, created, requestText);
}
public CourseAssessmentRequest updateCourseAssessmentRequest(CourseAssessmentRequest courseAssessmentRequest, Date created, String requestText, Boolean handled) {
return courseAssessmentRequestDAO.update(courseAssessmentRequest, created, requestText, handled);
}
public CourseAssessmentRequest findCourseAssessmentRequestById(Long id){
return courseAssessmentRequestDAO.findById(id);
}
public CourseAssessmentRequest findCourseAssessmentRequestByCourseStudent(CourseStudent courseStudent) {
// TODO Return latest request (as implemented) or enforce one assesssment request per course student?
CourseAssessmentRequest assessmentRequest = null;
List<CourseAssessmentRequest> courseAssessmentRequests = courseAssessmentRequestDAO.listByCourseStudent(courseStudent);
for (CourseAssessmentRequest courseAssessmentRequest : courseAssessmentRequests) {
if (assessmentRequest == null || courseAssessmentRequest.getCreated().after(assessmentRequest.getCreated())) {
assessmentRequest = courseAssessmentRequest;
}
}
return assessmentRequest;
}
public List<CourseAssessmentRequest> listCourseAssessmentRequestsByCourse(Course course) {
return courseAssessmentRequestDAO.listByCourse(course);
}
public List<CourseAssessmentRequest> listCourseAssessmentRequestsByCourseAndHandled(Course course, Boolean handled) {
return courseAssessmentRequestDAO.listByCourseAndHandled(course, handled);
}
public List<CourseAssessmentRequest> listCourseAssessmentRequestsByStudent(Student student) {
return courseAssessmentRequestDAO.listByStudent(student);
}
public List<CourseAssessmentRequest> listCourseAssessmentRequestsByCourseAndStudent(Course course, Student student) {
return courseAssessmentRequestDAO.listByCourseAndStudent(course, student);
}
public Long countCourseAssessments(Student student, Date timeIntervalStartDate, Date timeIntervalEndDate, Boolean passingGrade) {
return courseAssessmentDAO.countCourseAssessments(student, timeIntervalStartDate, timeIntervalEndDate, passingGrade);
}
public void deleteCourseAssessmentRequest(CourseAssessmentRequest courseAssessmentRequest) {
courseAssessmentRequestDAO.delete(courseAssessmentRequest);
}
}