
package de.ivu.elect.wus.exchange.wahlvorschlag.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.kandidatur.entity.Kandidatur;
import de.ivu.elect.business.person.entity.Personendaten;
import de.ivu.elect.business.wahlvorschlag.control.SperrlisteExportContext;
import de.ivu.elect.business.wahlvorschlagsperson.entity.WahlvorschlagsPerson;
import de.ivu.elect.exchange.csv.CsvMarshaller;
import de.ivu.elect.exchange.person.DefaultGesperrtePersonDTO;
import de.ivu.elect.wus.exchange.wahlvorschlag.SperrlisteExportMapper;

/*
 * ELECTMUC-425 Sperrliste für Wahlhelfer exportieren
 */
public class GesperrtePersonCsvExportMapper implements SperrlisteExportMapper {

  public static final String FORMAT_NAME = "file.format.wahl.wus.sperrliste";

  @Inject
  protected transient CsvMarshaller csvMarshaller;

  public GesperrtePersonCsvExportMapper() {
    super();
  }

  @Override
  public boolean isAcceptContext(SperrlisteExportContext sperrlisteExportContext) {
    return true;
  }

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

  @Override
  public void serialize(List<Personendaten> zuSperrendePersonen, OutputStream os, SperrlisteExportContext sperrlisteExportContext, FileKonfiguration fileKonfiguration) throws MappingException {
    csvMarshaller.serialize(DefaultGesperrtePersonDTO.class, mappeInternToExtern(zuSperrendePersonen), os, fileKonfiguration);
  }

  protected List<DefaultGesperrtePersonDTO> mappeInternToExtern(List<Personendaten> zuSperrendePersonen) {
    List<DefaultGesperrtePersonDTO> result = new ArrayList<>(zuSperrendePersonen.size());

    for (Personendaten person : zuSperrendePersonen) {
      result.add(mappeInternToExtern(person));
    }

    return result;
  }

  protected DefaultGesperrtePersonDTO mappeInternToExtern(Personendaten zuSperrendePerson) {
    return new DefaultGesperrtePersonDTO(zuSperrendePerson, ermittleSperrgrund(zuSperrendePerson));
  }

  protected String ermittleSperrgrund(Personendaten zuSperrendePerson) {
    if (zuSperrendePerson instanceof Kandidatur) {
      return "Person kandidiert bei Wahl";
    }

    if (zuSperrendePerson instanceof WahlvorschlagsPerson) {
      return "Person ist Wahlvorschlagsperson";
    }

    return "Person tritt als Kandidat an oder ist Wahlvorschlagsperson";
  }
}
