package edu.pdx.cs410J.grader;
import java.util.*;
public class GradesFromD2L {
private List<D2LStudent> students = new ArrayList<>();
public static D2LStudentBuilder newStudent() {
return new D2LStudentBuilder();
}
public void addStudent(D2LStudent student) {
this.students.add(student);
}
public Optional<Student> findStudentInGradebookForD2LStudent(D2LStudent d2lStudent, GradeBook book) {
return book.studentsStream().filter((Student student) -> {
if (haveSameD2LId(d2lStudent, student)) {
return true;
} else if (studentIdIsSameAsD2LId(d2lStudent, student)) {
student.setD2LId(d2lStudent.getD2lId());
return true;
} else if (haveSameFirstAndLastNameIgnoringCase(d2lStudent, student)) {
student.setD2LId(d2lStudent.getD2lId());
return true;
} else {
return false;
}
}).findAny();
}
private boolean studentIdIsSameAsD2LId(D2LStudent d2lStudent, Student student) {
return d2lStudent.getD2lId().equals(student.getId());
}
private boolean haveSameFirstAndLastNameIgnoringCase(D2LStudent d2lStudent, Student student) {
return d2lStudent.getFirstName().equalsIgnoreCase(student.getFirstName()) &&
d2lStudent.getLastName().equalsIgnoreCase(student.getLastName());
}
private boolean haveSameD2LId(D2LStudent d2lStudent, Student student) {
return d2lStudent.getD2lId().equals(student.getD2LId());
}
public List<D2LStudent> getStudents() {
return this.students;
}
public Optional<Assignment> findAssignmentInGradebookForD2lQuiz(String quizName, GradeBook gradebook) {
Assignment assignment = gradebook.getAssignment(quizName);
if (assignment != null) {
return Optional.ofNullable(assignment);
}
return findAssignmentInGradebookLike(quizName, gradebook);
}
private Optional<Assignment> findAssignmentInGradebookLike(String quizName, GradeBook gradebook) {
for (String assignmentName : gradebook.getAssignmentNames()) {
Assignment assignment = gradebook.getAssignment(assignmentName);
if (quizName.startsWith(assignmentName)) {
return Optional.ofNullable(assignment);
}
if (quizName.startsWith(assignment.getDescription())) {
return Optional.of(assignment);
}
}
return Optional.empty();
}
static class D2LStudent {
private final String firstName;
private final String lastName;
private final String d2lId;
private Map<String, Double> scores = new HashMap<>();
public D2LStudent(String firstName, String lastName, String d2lId) {
this.firstName = firstName;
this.lastName = lastName;
this.d2lId = d2lId;
}
public String getD2lId() {
return d2lId;
}
public String getFirstName() {
return firstName;
}
public String getLastName() {
return lastName;
}
public void setScore(String quizName, double score) {
this.scores.put(quizName, score);
}
public Double getScore(String quizName) {
return this.scores.get(quizName);
}
public Iterable<String> getQuizNames() {
return this.scores.keySet();
}
@Override
public String toString() {
return "D2L student \"" + getFirstName() + " " + getLastName() + "\" with id " + getD2lId();
}
}
static class D2LStudentBuilder {
private String firstName;
private String lastName;
private String d2lId;
private D2LStudentBuilder() {
}
public D2LStudentBuilder setFirstName(String firstName) {
this.firstName = firstName;
return this;
}
public D2LStudentBuilder setLastName(String lastName) {
this.lastName = lastName;
return this;
}
public D2LStudentBuilder setD2LId(String d2lId) {
this.d2lId = d2lId;
return this;
}
public D2LStudent create() {
if (firstName == null) {
throw new IllegalStateException("Missing first name");
}
if (lastName == null) {
throw new IllegalStateException("Missing last name");
}
if (d2lId == null) {
throw new IllegalStateException("Missing d2l Id");
}
return new D2LStudent(firstName, lastName, d2lId);
}
}
}