001package edu.pdx.cs.joy.grader.canvas;
002
003import com.opencsv.CSVWriter;
004import edu.pdx.cs.joy.grader.gradebook.Assignment;
005import edu.pdx.cs.joy.grader.gradebook.GradeBook;
006import edu.pdx.cs.joy.grader.gradebook.Student;
007
008import java.io.Writer;
009import java.util.ArrayList;
010import java.util.List;
011import java.util.function.Function;
012
013public class CanvasGradesCSVGenerator implements CanvasGradesCSVColumnNames {
014  private final Writer writer;
015
016  public CanvasGradesCSVGenerator(Writer writer) {
017    this.writer = writer;
018  }
019
020  public void generate(GradeBook book) {
021    CSVWriter csv = new CSVWriter(writer);
022    writeHeaderRow(book, csv);
023    writeManualPostingRow(book, csv);
024    writePossiblePointsRow(book, csv);
025    writeStudentRows(book, csv);
026  }
027
028  private void writeManualPostingRow(GradeBook book, CSVWriter csv) {
029    List<String> line = new ArrayList<>();
030    line.add("");  // Student Name
031    line.add("");  // Login ID
032    line.add("");  // Section
033
034    addCellsForEachAssignment(book, line, assignment -> "");
035
036    csv.writeNext(line.toArray(new String[0]));
037  }
038
039  private void writePossiblePointsRow(GradeBook book, CSVWriter csv) {
040    List<String> line = new ArrayList<>();
041    line.add("Possible Points");
042    line.add("");  // Login ID
043    line.add("");  // Section
044
045    addCellsForEachAssignment(book, line, this::getPossiblePoints);
046
047    csv.writeNext(line.toArray(new String[0]));
048
049  }
050
051  private String getPossiblePoints(Assignment assignment) {
052    return String.valueOf(assignment.getPoints());
053  }
054
055  private void writeStudentRows(GradeBook book, CSVWriter csv) {
056    book.studentsStream().forEach(student -> writeStudentRow(book, student, csv));
057  }
058
059  private void writeStudentRow(GradeBook book, Student student, CSVWriter csv) {
060    csv.writeNext(getStudentLine(book, student));
061  }
062
063  private String[] getStudentLine(GradeBook book, Student student) {
064    return new String[] {
065      getStudentName(student),
066      student.getCanvasId(),
067      book.getSectionName(student.getEnrolledSection())
068    };
069  }
070
071  private String getStudentName(Student student) {
072    return student.getLastName() + ", " + student.getFirstName();
073  }
074
075  private void writeHeaderRow(GradeBook book, CSVWriter csv) {
076    List<String> line = new ArrayList<>();
077    line.add(STUDENT_COLUMN);
078    line.add(ID_COLUMN);
079    line.add(SECTION_COLUMN);
080
081    addCellsForEachAssignment(book, line, this::getAssignmentHeaderCell);
082
083    csv.writeNext(line.toArray(new String[0]));
084  }
085
086  private void addCellsForEachAssignment(GradeBook book, List<String> line, Function<Assignment, String> function) {
087    book.getAssignmentNames().stream().map(book::getAssignment).forEach(assignment -> {
088      line.add(function.apply(assignment));
089    });
090  }
091
092  private String getAssignmentHeaderCell(Assignment assignment) {
093    return assignment.getName() + " (" + assignment.getCanvasId() + ")" ;
094  }
095}