
package de.ivu.elect.dokumente.stimmzettel;

import java.io.OutputStream;
import java.util.ArrayList;
import java.util.List;
import java.util.Objects;

import javax.annotation.Nonnull;
import javax.annotation.Nullable;
import javax.inject.Inject;

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

/**
 * Delegiert die Erstellung und Befüllung des Stimmzettels an einen bestehenden DokumentGenerator.
 */
public abstract class AbstractStimmzettelByDokumentGeneratorDocumentMapper<E, C extends ElectDokumentContext> extends AbstractDokumentGeneratorDocumentMapper<StimmzettelExportContext, E, C> {

  @Inject
  private transient StimmzettelByDokumentGeneratorExportFormBuilder stimmzettelByDokumentGeneratorExportFormBuilder;

  protected AbstractStimmzettelByDokumentGeneratorDocumentMapper() {
    super();
  }

  public boolean isAcceptContext(@Nonnull Wahl wahl, @Nullable DokumentVorlage dokumentVorlage) {
    return dokumentVorlage != null && Objects.equals(dokumentVorlage.getDokumentVorlageArt(), getDokumentVorlageArt());
  }

  public FileType getFileType() {
    return AbstractStimmzettelDocumentExportMapper.FILE_TYPE_CONFIGURABLE; // Cf. StimmzettelByDokumentGeneratorExportFormBuilder#addProperties!
  }

  public FileType getFileTypeSerialized(StimmzettelExportContext context) {
    FileType targetFileType = context.getTargetFileType();

    if (targetFileType == null) {
      return getDokumentVorlageFileType();
    }

    return targetFileType;
  }

  @Override
  public void addProperties(FormBuilder formBuilder, StimmzettelExportContext context) {
    List<FileType> targetFileTypeValues = new ArrayList<>();
    targetFileTypeValues.add(FileType.ODT);
    targetFileTypeValues.add(FileType.DOCX);

    stimmzettelByDokumentGeneratorExportFormBuilder.addProperties(formBuilder, context, targetFileTypeValues);
  }

  public void serialize(OutputStream os, StimmzettelExportContext context, String fileFormatName, WahlverwaltungGebietInformation auswertungsgebietInformation, E dokumentEntities,
      @Nullable DokumentVorlage dokumentVorlage, boolean closeOutputStream) throws Exception {
    serialize(os, context, fileFormatName, getFileTypeSerialized(context), createDokumentContext(context, auswertungsgebietInformation), dokumentEntities, dokumentVorlage, closeOutputStream);
  }

  protected abstract C createDokumentContext(StimmzettelExportContext context, WahlverwaltungGebietInformation auswertungsgebietInformation);
}
