
package de.ivu.elect.exchange.benutzer.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.benutzerverwaltung.control.BenutzerExchangeContext;
import de.ivu.elect.business.benutzerverwaltung.entity.Benutzer;
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.exchange.CsvImportMapper;
import de.ivu.elect.exchange.benutzer.AbstractDefaultBenutzerMapper;
import de.ivu.elect.exchange.csv.CsvMarshaller;
import de.ivu.elect.jee.exchange.Violations;

public class DefaultCsvBenutzerMapper extends AbstractDefaultBenutzerMapper<DefaultCsvBenutzer> implements CsvImportMapper<List<Benutzer>, BenutzerExchangeContext> {

  @Inject
  protected transient CsvMarshaller csvMarshaller;

  public DefaultCsvBenutzerMapper() {
    super();
  }

  @Override
  protected DefaultCsvBenutzer createBenutzer() {
    return new DefaultCsvBenutzer();
  }

  @Override
  public boolean isAcceptContext(BenutzerExchangeContext context) {
    return true;
  }

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

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

  @Override
  public void serialize(List<Benutzer> object, OutputStream os, BenutzerExchangeContext context, FileKonfiguration fileKonfiguration) {
    csvMarshaller.serialize(DefaultCsvBenutzer.class, mappeBenutzerInternToExtern(object), os, fileKonfiguration);
  }

  @Override
  public List<Benutzer> deserialize(InputStream is, BenutzerExchangeContext context, FileKonfiguration fileKonfiguration) {
    return mappeBenutzerExternToIntern(csvMarshaller.deserialize(DefaultCsvBenutzer.class, is, fileKonfiguration));
  }

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

  protected List<DefaultCsvBenutzer> mappeBenutzerInternToExtern(List<Benutzer> benutzerListe) {
    List<DefaultCsvBenutzer> mappedBenutzer = new ArrayList<>(benutzerListe.size());

    for (Benutzer benutzer : benutzerListe) {
      mappedBenutzer.add(mappeBenutzer(benutzer));
    }

    return mappedBenutzer;
  }

  protected List<Benutzer> mappeBenutzerExternToIntern(List<DefaultCsvBenutzer> benutzerListe) {
    List<Benutzer> mappedBenutzer = new ArrayList<>(benutzerListe.size());

    for (DefaultCsvBenutzer benutzer : benutzerListe) {
      mappedBenutzer.add(mappeBenutzer(benutzer));
    }

    return mappedBenutzer;
  }
}
