
package de.ivu.elect.was.exchange.gebietsbaum.wahlberechtigte;

import java.io.InputStream;
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.boundary.WahldurchfuehrungsgebietFactory;
import de.ivu.elect.business.gebietsbaum.entity.AnzahlWahlberechtigteImportContext;
import de.ivu.elect.business.gebietsbaum.entity.AnzahlWahlberechtigteExchangeObjekt;
import de.ivu.elect.business.gebietsbaum.entity.Gebietsart;
import de.ivu.elect.business.gebietsbaum.entity.Wahldurchfuehrungsgebiet;
import de.ivu.elect.exchange.CsvImportMapper;
import de.ivu.elect.exchange.csv.CsvMarshaller;
import de.ivu.elect.jee.exchange.Violations;

public class DefaultAnzahlWahlberechtigteCsvImportMapper implements AnzahlWahlberechtigteImportMapper, CsvImportMapper<AnzahlWahlberechtigteExchangeObjekt, AnzahlWahlberechtigteImportContext> {

  public static final String FILE_FORMAT_NAME = "file.format.gebietsbaum.was.anzahl.wahlberechtigte";

  @Inject
  private transient CsvMarshaller csvMarshaller;

  @Inject
  private transient WahldurchfuehrungsgebietFactory wahldurchfuehrungsgebietFactory;

  public DefaultAnzahlWahlberechtigteCsvImportMapper() {
    super();
  }

  @Override
  public boolean isAcceptContext(AnzahlWahlberechtigteImportContext context) {
    return context.hasWahl();
  }

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

  @Override
  public List<String> getCsvColumnHeaders(AnzahlWahlberechtigteImportContext context) {
    return csvMarshaller.extractHeader(DefaultAnzahlWahlberechtigteCsvDTO.class);
  }

  @Override
  public AnzahlWahlberechtigteExchangeObjekt deserialize(InputStream is, AnzahlWahlberechtigteImportContext context, FileKonfiguration fileKonfiguration) throws MappingException {
    List<DefaultAnzahlWahlberechtigteCsvDTO> dtos = deserialize(is, fileKonfiguration);

    List<Wahldurchfuehrungsgebiet> gebiete = new ArrayList<>(dtos.size());

    for (DefaultAnzahlWahlberechtigteCsvDTO dto : dtos) {
      Gebietsart gebietsart = new Gebietsart();
      gebietsart.setName(dto.getGebietsart());

      Wahldurchfuehrungsgebiet wahldurchfuehrungsgebiet = createWahldurchfuehrungsgebiet();
      wahldurchfuehrungsgebiet.setNummer(dto.getGebietsnummer());
      wahldurchfuehrungsgebiet.setGebietsart(gebietsart);

      wahldurchfuehrungsgebiet.setAnzahlWahlberechtigteOhneWahlschein(dto.getAnzahlWahlberechtigteOhneWahlschein());
      wahldurchfuehrungsgebiet.setAnzahlWahlberechtigteMitWahlschein(dto.getAnzahlWahlberechtigteMitWahlschein());
      wahldurchfuehrungsgebiet.setAnzahlWahlberechtigteNichtImWaehlerverzeichnis(dto.getAnzahlWahlberechtigteNichtImWaehlerverzeichnis());

      gebiete.add(wahldurchfuehrungsgebiet);
    }

    return new AnzahlWahlberechtigteExchangeObjekt(gebiete);
  }

  protected List<DefaultAnzahlWahlberechtigteCsvDTO> deserialize(InputStream is, FileKonfiguration fileKonfiguration) {
    return csvMarshaller.deserialize(DefaultAnzahlWahlberechtigteCsvDTO.class, is, fileKonfiguration);
  }

  @Override
  public Violations validateInputFormat(InputStream is, AnzahlWahlberechtigteImportContext context, FileKonfiguration fileKonfiguration) {
    return new Violations();
  }

  private Wahldurchfuehrungsgebiet createWahldurchfuehrungsgebiet() {
    return wahldurchfuehrungsgebietFactory.create();
  }
}
