
package de.ivu.elect.dokumente.stimmzettel;

import java.io.OutputStream;
import java.util.List;
import java.util.Map.Entry;

import de.ivu.elect.business.datei.entity.FileType;
import de.ivu.elect.business.dokumente.entity.DokumentVorlage;
import de.ivu.elect.business.dokumente.entity.DokumentVorlageArt;
import de.ivu.elect.business.gebietsbaum.boundary.WahlverwaltungGebietInformation;
import de.ivu.elect.business.stimmzettel.control.StimmzettelExportContext;
import de.ivu.elect.business.stimmzettel.entity.StimmzettelDaten;
import de.ivu.elect.business.wahl.entity.Wahl;
import de.ivu.elect.jee.presentation.dynamicform.FormBuilder;

public abstract class AbstractStimmzettelByDokumentGeneratorDocumentMapperExportMapper<E> extends AbstractStimmzettelDocumentExportMapper {

  protected static final String DEFAULT_DOKUMENT_VORLAGE_NAME_INFIX = "stimmzettel";

  protected AbstractStimmzettelByDokumentGeneratorDocumentMapperExportMapper() {
    super();
  }

  @Override
  protected boolean isAcceptContext(Wahl wahl, DokumentVorlage dokumentVorlage) {
    return getDokumentGeneratorDocumentMapper().isAcceptContext(wahl, dokumentVorlage) && isAcceptContext(wahl);
  }

  protected abstract boolean isAcceptContext(Wahl wahl);

  @Override
  public FileType getTargetFileType(StimmzettelExportContext context) {
    return getFileTypeSerialized(context); // Typ der finalen Datei == Typ der generierten Datei des Dokumentgenerators...
  }

  @Override
  public FileType getFileType() {
    return getDokumentGeneratorDocumentMapper().getFileType();
  }

  @Override
  protected FileType getFileTypeSerialized(StimmzettelExportContext context) {
    return getDokumentGeneratorDocumentMapper().getFileTypeSerialized(context);
  }

  @Override
  protected DokumentVorlageArt getDokumentVorlageArt() {
    return getDokumentGeneratorDocumentMapper().getDokumentVorlageArt();
  }

  @Override
  protected FileType getDokumentVorlageFileType(StimmzettelExportContext context) {
    return getDokumentGeneratorDocumentMapper().getDokumentVorlageFileType();
  }

  @Override
  protected abstract String getDokumentVorlageNameInfix();

  @Override
  public void addProperties(FormBuilder formBuilder, StimmzettelExportContext context) {
    getDokumentGeneratorDocumentMapper().addProperties(formBuilder, context);
  }

  @Override
  protected void serialize(OutputStream os, StimmzettelExportContext context, String fileFormatName, WahlverwaltungGebietInformation auswertungsgebietInformation,
      List<Entry<WahlverwaltungGebietInformation, StimmzettelDaten>> stimmzettelDatenPerStimmzettelgebiet, DokumentVorlage dokumentVorlage, boolean closeOutputStream) throws Exception {
    getDokumentGeneratorDocumentMapper().serialize(os, context, fileFormatName, auswertungsgebietInformation,
        collectDokumentEntities(context.getWahl(), auswertungsgebietInformation, stimmzettelDatenPerStimmzettelgebiet), dokumentVorlage, closeOutputStream);
  }

  protected abstract AbstractStimmzettelByDokumentGeneratorDocumentMapper<E, ? > getDokumentGeneratorDocumentMapper();

  protected abstract E collectDokumentEntities(Wahl wahl, WahlverwaltungGebietInformation auswertungsgebietInformation,
      List<Entry<WahlverwaltungGebietInformation, StimmzettelDaten>> stimmzettelDatenPerStimmzettelgebiet);
}
