
package de.ivu.elect.exchange.gebietsbaum.csv;

import java.io.OutputStream;
import java.util.ArrayList;
import java.util.List;

import javax.inject.Inject;

import de.ivu.elect.business.datei.entity.FileType;
import de.ivu.elect.business.exchange.control.FileFormat;
import de.ivu.elect.business.exchange.control.FileKonfiguration;
import de.ivu.elect.business.exchange.control.MappingException;
import de.ivu.elect.business.gebietsbaum.control.GebietsgruppierungExportContext;
import de.ivu.elect.business.gebietsbaum.entity.Gebiet;
import de.ivu.elect.business.gebietsbaum.entity.Gebietsgruppierung;
import de.ivu.elect.exchange.csv.CsvMarshaller;
import de.ivu.elect.exchange.gebietsbaum.GebietsgruppierungExportMapper;

public class DefaultGebietsgruppierungCsvExportMapper implements GebietsgruppierungExportMapper {

  public static final String FORMAT_NAME = "file.format.gebietsgruppierung.export.default";

  @Inject
  private transient CsvMarshaller csvMarshaller;

  public DefaultGebietsgruppierungCsvExportMapper() {
    super();
  }

  @Override
  public void serialize(List<Gebietsgruppierung> gebietsgruppierungen, OutputStream os, GebietsgruppierungExportContext exportContext, FileKonfiguration fileKonfiguration) throws MappingException {
    csvMarshaller.serialize(DefaultGebietsgruppierungCsvDTO.class, mappeEntityToDto(gebietsgruppierungen), os, fileKonfiguration);
  }

  private List<DefaultGebietsgruppierungCsvDTO> mappeEntityToDto(List<Gebietsgruppierung> gebietsgruppierungen) {
    List<DefaultGebietsgruppierungCsvDTO> result = new ArrayList<>();
    for (Gebietsgruppierung gebietsgruppierung : gebietsgruppierungen) {
      for (Gebiet gebiet : gebietsgruppierung.getGebiets()) {
        result.add(new DefaultGebietsgruppierungCsvDTO(gebietsgruppierung.getName(), gebietsgruppierung.getGebietsgruppierungArt(), gebietsgruppierung.getPosition(), gebiet.getGebietsart().getName(),
            gebiet.getNummer()));
      }
    }
    return result;
  }

  @Override
  public FileFormat getFileFormat() {
    return new FileFormat(FORMAT_NAME, FileType.CSV);
  }

  @Override
  public boolean isAcceptContext(GebietsgruppierungExportContext gebietsgruppierungExportContext) {
    return gebietsgruppierungExportContext.getWahl() != null || gebietsgruppierungExportContext.getWahltermin() != null;
  }
}
