package charts.builder.spreadsheet;
import static com.google.common.collect.Lists.newArrayList;
import java.io.IOException;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import org.supercsv.io.CsvListWriter;
import charts.AbstractChart;
import charts.Chart;
import charts.ChartDescription;
import charts.ChartType;
import charts.Drawable;
import charts.Region;
import charts.builder.DataSource.MissingDataException;
import charts.builder.csv.Csv;
import charts.builder.csv.CsvWriter;
import charts.graphics.ProgressTable;
import charts.graphics.ProgressTable.Indicator;
import com.google.common.collect.Lists;
public class ProgressTileBuilder extends AbstractProgressTableBuilder {
public ProgressTileBuilder() {
super(Lists.newArrayList(ChartType.PROGRESS_TABLE_TILE));
}
@Override
protected Map<String, List<String>> getParameters(SpreadsheetDataSource datasource, ChartType type) {
if (type != null && !type.equals(ChartType.PROGRESS_TABLE_TILE)) {
return Collections.emptyMap();
}
final List<String> indicators = newArrayList();
for (Indicator i : ProgressTable.Indicator.values()) {
indicators.add(i.toString());
}
return Collections.singletonMap("indicator", indicators);
}
@Override
public Chart build(Context ctx) {
final SpreadsheetDataSource datasource = ctx.datasource();
final ChartType type = ctx.type();
final Region region = ctx.region();
final Map<String, String> parameters = ctx.parameters();
if (!parameters.containsKey("indicator")) {
return null;
}
final ProgressTable.Indicator indicator =
ProgressTable.Indicator.valueOf(parameters.get("indicator"));
try {
final ProgressTable.Cell cell =
getIndicatorCell(datasource, region, indicator);
if (cell == null) {
return null;
}
final ProgressTable pt = new ProgressTable(cell);
return new AbstractChart() {
@Override
public ChartDescription getDescription() {
return new ChartDescription(type, region, parameters,
"Progress Tile - "+indicator.getLabel());
}
@Override
public Drawable getChart() {
return pt;
}
@Override
public String getCSV() throws UnsupportedFormatException {
return Csv.write(new CsvWriter() {
@Override
public void write(CsvListWriter csv) throws IOException {
{
final List<String> cList = Lists.newLinkedList();
cList.add("Indicator");
cList.add(indicator.getLabel());
csv.write(cList);
}
{
final List<String> cList = Lists.newLinkedList();
cList.add("Progress");
cList.add(cell.progress.toString());
csv.write(cList);
}
{
final List<String> cList = Lists.newLinkedList();
cList.add("Condition");
cList.add(cell.condition.toString());
csv.write(cList);
}
}});
}
};
} catch (MissingDataException e) {
return null;
}
}
private ProgressTable.Cell getIndicatorCell(SpreadsheetDataSource datasource,
Region region, Indicator indicator) throws MissingDataException {
final List<ProgressTable.Column> columns = getColumns(datasource, region);
for (ProgressTable.Cell cell : getRow(columns, datasource, region).cells) {
if (cell.indicator != null && cell.indicator.equals(indicator)) {
return cell;
}
}
return null;
}
}