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

import java.io.InputStream;
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.wahl.control.WahlParameterExchangeContext;
import de.ivu.elect.business.wahl.entity.WahlParameter;
import de.ivu.elect.exchange.CsvImportMapper;
import de.ivu.elect.exchange.csv.CsvMarshaller;
import de.ivu.elect.exchange.konfiguration.csv.DefaultExchangeKonfigurationCsv;
import de.ivu.elect.exchange.wahl.AbstractDefaultWahlParameterMapper;
import de.ivu.elect.jee.exchange.Violations;

public class DefaultCsvWahlParameterMapper extends AbstractDefaultWahlParameterMapper<DefaultExchangeKonfigurationCsv> implements CsvImportMapper<List<WahlParameter>, WahlParameterExchangeContext> {

  @Inject
  private transient CsvMarshaller csvMarshaller;

  public DefaultCsvWahlParameterMapper() {
    super();
  }

  @Override
  public void serialize(List<WahlParameter> object, OutputStream os, WahlParameterExchangeContext context, FileKonfiguration fileKonfiguration) {
    csvMarshaller.serialize(DefaultExchangeKonfigurationCsv.class, mappeEntityInternToExtern(object), os, fileKonfiguration);
  }

  @Override
  public List<WahlParameter> deserialize(InputStream is, WahlParameterExchangeContext context, FileKonfiguration fileKonfiguration) {
    return mappeEntityExternToIntern(csvMarshaller.deserialize(DefaultExchangeKonfigurationCsv.class, is, fileKonfiguration));
  }

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

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

  @Override
  protected DefaultExchangeKonfigurationCsv createEntity() {
    return new DefaultExchangeKonfigurationCsv();
  }

  protected List<DefaultExchangeKonfigurationCsv> mappeEntityInternToExtern(List<WahlParameter> entityListe) {
    List<DefaultExchangeKonfigurationCsv> mappedEntity = new ArrayList<>(entityListe.size());
    for (WahlParameter entity : entityListe) {
      mappedEntity.add(mappeEntity(entity));
    }
    return mappedEntity;
  }

  protected List<WahlParameter> mappeEntityExternToIntern(List<DefaultExchangeKonfigurationCsv> entityListe) {
    List<WahlParameter> mappedBenutzer = new ArrayList<>(entityListe.size());
    for (DefaultExchangeKonfigurationCsv entity : entityListe) {
      mappedBenutzer.add(mappeEntity(entity));
    }
    return mappedBenutzer;
  }

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