package com.metservice.kanban.csv;
import static com.metservice.kanban.csv.CsvConstants.AVERAGE_CASE_ESIMATE;
import static com.metservice.kanban.csv.CsvConstants.COLOR_COLUMN_NAME;
import static com.metservice.kanban.csv.CsvConstants.EXCLUDED_COLUMN_NAME;
import static com.metservice.kanban.csv.CsvConstants.ID_COLUMN_NAME;
import static com.metservice.kanban.csv.CsvConstants.IMPORTANCE_COLUMN_NAME;
import static com.metservice.kanban.csv.CsvConstants.MUST_HAVE;
import static com.metservice.kanban.csv.CsvConstants.NAME_COLUMN_NAME;
import static com.metservice.kanban.csv.CsvConstants.NOTES_COLUMN_NAME;
import static com.metservice.kanban.csv.CsvConstants.PARENT_ID_COLUMN_NAME;
import static com.metservice.kanban.csv.CsvConstants.STOPPED_COLUMN_NAME;
import static com.metservice.kanban.csv.CsvConstants.WORK_STREAMS;
import static com.metservice.kanban.csv.CsvConstants.WORST_CASE_ESIMATE;
import static com.metservice.kanban.utils.DateUtils.formatIsoDate;
import java.io.IOException;
import java.io.Writer;
import java.util.List;
import au.com.bytecode.opencsv.CSVWriter;
import com.metservice.kanban.model.WorkItem;
import com.metservice.kanban.model.WorkItemType;
public class KanbanCsvWriter {
private static final int NUMBER_OF_METADATA_COLUMNS = 12;
private final CSVWriter csvWriter;
private final List<String> phases;
public KanbanCsvWriter(Writer writer, WorkItemType workItemType) {
this.csvWriter = new CSVWriter(writer);
this.phases = workItemType.getPhases();
}
public void write(List<WorkItem> workItems) throws IOException {
writeColumnHeadings();
for (WorkItem workItem : workItems) {
writeWorkItem(workItem);
}
}
private void writeColumnHeadings() {
String[] data = new String[phases.size() + NUMBER_OF_METADATA_COLUMNS];
data[0] = ID_COLUMN_NAME;
data[1] = PARENT_ID_COLUMN_NAME;
data[2] = NAME_COLUMN_NAME;
data[3] = AVERAGE_CASE_ESIMATE;
data[4] = WORST_CASE_ESIMATE;
data[5] = IMPORTANCE_COLUMN_NAME;
data[6] = NOTES_COLUMN_NAME;
data[7] = EXCLUDED_COLUMN_NAME;
data[8] = STOPPED_COLUMN_NAME;
data[9] = COLOR_COLUMN_NAME;
data[10] = MUST_HAVE;
data[11] = WORK_STREAMS;
int arrayIndex = NUMBER_OF_METADATA_COLUMNS;
for (String phase : phases) {
data[arrayIndex] = phase;
arrayIndex++;
}
csvWriter.writeNext(data);
}
private void writeWorkItem(WorkItem workItem) {
String[] data = new String[phases.size() + NUMBER_OF_METADATA_COLUMNS];
data[0] = Integer.toString(workItem.getId());
data[1] = Integer.toString(workItem.getParentId());
data[2] = workItem.getName();
data[3] = Integer.toString(workItem.getAverageCaseEstimate());
data[4] = Integer.toString(workItem.getWorstCaseEstimate());
data[5] = Integer.toString(workItem.getImportance());
data[6] = workItem.getNotes();
data[7] = Boolean.toString(workItem.isExcluded());
data[8] = Boolean.toString(workItem.isBlocked());
data[9] = workItem.getColour().toString().substring(1);
data[10] = Boolean.toString(workItem.isMustHave());
data[11] = workItem.getWorkStreamsAsString();
int arrayIndex = NUMBER_OF_METADATA_COLUMNS;
for (String phase : phases) {
if (workItem.hasDate(phase)) {
data[arrayIndex] = formatIsoDate(workItem.getDate(phase));
}
arrayIndex++;
}
csvWriter.writeNext(data);
}
public void close() throws IOException {
csvWriter.close();
}
public void closeQuietly() {
try {
csvWriter.close();
} catch (Exception e) {
}
}
}