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

import java.io.InputStream;
import java.util.List;

import javax.inject.Inject;

import de.ivu.elect.business.benutzerverwaltung.entity.RechteKonfiguration;
import de.ivu.elect.business.benutzerverwaltung.entity.RechteKonfigurationExchangeContext;
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.exchange.CsvImportMapper;
import de.ivu.elect.exchange.csv.CsvMarshaller;
import de.ivu.elect.exchange.rolle.RechteKonfigurationImportMapper;
import de.ivu.elect.jee.exchange.Violations;

import static java.util.stream.Collectors.toList;

public class CsvRechteKonfigurationImportMapper implements RechteKonfigurationImportMapper, CsvImportMapper<List<RechteKonfiguration>, RechteKonfigurationExchangeContext> {

  public static final String FORMAT_NAME = "file.format.rechte.konfiguration.default";

  @Inject
  private transient CsvMarshaller csvMarshaller;

  public CsvRechteKonfigurationImportMapper() {
    super();
  }

  @Override
  public List<RechteKonfiguration> deserialize(InputStream is, RechteKonfigurationExchangeContext noContext, FileKonfiguration fileKonfiguration) throws MappingException {
    return mappeEntityExternToIntern(csvMarshaller.deserialize(DefaultRechteKonfigurationCsvDTO.class, is, fileKonfiguration));
  }

  private List<RechteKonfiguration> mappeEntityExternToIntern(List<DefaultRechteKonfigurationCsvDTO> deserialize) {
    return deserialize.stream().map(DefaultRechteKonfigurationCsvDTO::createRechteKonfiguration).collect(toList());
  }

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

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

  @Override
  public boolean isAcceptContext(RechteKonfigurationExchangeContext noContext) {
    return true;
  }

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