
package de.ivu.elect.wus.exchange.wahlvorschlag.csv;

import java.io.OutputStream;
import java.util.ArrayList;
import java.util.LinkedHashSet;
import java.util.List;
import java.util.Set;

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.wahlausschuss.entity.Wahlausschussmitglied;
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.jee.faces.Messages;
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 Messages messages;

  @Inject
  protected transient CsvMarshaller csvMarshaller;

  public GesperrtePersonCsvExportMapper() {
    super();
  }

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

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

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

  protected List<DefaultGesperrtePersonDTO> internToExtern(List<Personendaten> gesperrtePersonen) {
    Set<DefaultGesperrtePersonDTO> result = new LinkedHashSet<>(
        gesperrtePersonen.size()); // ELECT-16172, keine Dubletten (identische "Zeilen"), aber Reihenfolge beibehalten...

    for (Personendaten person : gesperrtePersonen) {
      result.add(internToExtern(person));
    }

    return new ArrayList<>(result);
  }

  protected DefaultGesperrtePersonDTO internToExtern(Personendaten gesperrtePerson) {
    DefaultGesperrtePersonDTO result = new DefaultGesperrtePersonDTO();

    result.setOrdnungsmerkmal(gesperrtePerson.getOrdnungsmerkmal());
    result.setFamilienname(gesperrtePerson.getFamilienname());
    result.setRufname(gesperrtePerson.getRufname());
    result.setGeburtsdatum(gesperrtePerson.getGeburtsdatum());
    result.setGeschlecht(gesperrtePerson.getGeschlecht().toString());
    result.setSperrgrund(ermittleSperrgrund(gesperrtePerson));

    return result;
  }

  protected String ermittleSperrgrund(Personendaten gesperrtePerson) {
    if (gesperrtePerson instanceof Kandidatur) {
      return messages.getMessageForMessageKey("gesperrte.person.sperrgrund.kandidatur");
    }

    if (gesperrtePerson instanceof WahlvorschlagsPerson) {
      return messages.getMessageForMessageKey("gesperrte.person.sperrgrund.wahlvorschlagsperson");
    }
    if (gesperrtePerson instanceof Wahlausschussmitglied) {
      return messages.getMessageForMessageKey("gesperrte.person.sperrgrund.wahlausschussmitglied");
    }

    return messages.getMessageForMessageKey("gesperrte.person.sperrgrund.sonstige");
  }
}
