
package de.ivu.elect.business.stimmzettel.control;

import static java.util.Collections.emptyList;
import static java.util.Collections.singletonList;

import java.util.Collection;

import javax.annotation.Nullable;

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.ergebnis.control.ErgebnisExchangeContext;
import de.ivu.elect.business.gebietsbaum.boundary.AbstractGebietDAO;
import de.ivu.elect.business.gebietsbaum.entity.EntityMitGebiet;
import de.ivu.elect.business.gebietsbaum.entity.Gebiet;
import de.ivu.elect.business.kandidatur.control.StimmzettelFormatterKandidaturFormatDarstellung;

public class StimmzettelExportContext extends ElectDokumentContext {

  private static final long serialVersionUID = 1L;

  private final ErgebnisExchangeContext ergebnisExchangeContext;

  private DokumentVorlage dokumentVorlage;

  private Boolean dokumentVorlageResourcesIncluded;

  private StimmzettelFormatterKandidaturFormatDarstellung kandidaturFormatDarstellung;

  private FileType targetFileType;

  private boolean targetCreatedPerWurzelgebiet;

  public StimmzettelExportContext(ElectDokumentContext electDokumentContext) {
    this(electDokumentContext, null);
  }

  public StimmzettelExportContext(ElectDokumentContext electDokumentContext, Gebiet auswertungsgebiet) {
    this(electDokumentContext, auswertungsgebiet, null);
  }

  public StimmzettelExportContext(ElectDokumentContext electDokumentContext, Gebiet auswertungsgebiet, @Nullable DokumentVorlage dokumentVorlage) {
    super(electDokumentContext);

    this.ergebnisExchangeContext = new ErgebnisExchangeContext(electDokumentContext.getWahl(), auswertungsgebiet == null ? emptyList() : singletonList(auswertungsgebiet), null);

    this.dokumentVorlage = dokumentVorlage;
    this.dokumentVorlageResourcesIncluded = false;

    this.targetFileType = null;
    this.targetCreatedPerWurzelgebiet = false;
  }

  public DokumentVorlage getDokumentVorlage() {
    return dokumentVorlage;
  }

  public void setDokumentVorlage(DokumentVorlage dokumentVorlage) {
    this.dokumentVorlage = dokumentVorlage;
  }

  public Boolean getDokumentVorlageResourcesIncluded() {
    return Boolean.TRUE.equals(dokumentVorlageResourcesIncluded);
  }

  public void setDokumentVorlageResourcesIncluded(Boolean dokumentVorlageResourcesIncluded) {
    this.dokumentVorlageResourcesIncluded = dokumentVorlageResourcesIncluded;
  }

  public <T extends EntityMitGebiet> Collection<T> collectEntitiesExportierbar(AbstractGebietDAO gebietDAO, Collection<T> entities) {
    return ergebnisExchangeContext.collectEntitiesExportierbar(gebietDAO, entities);
  }

  public StimmzettelFormatterKandidaturFormatDarstellung getKandidaturFormatDarstellung() {
    return kandidaturFormatDarstellung;
  }

  public void setKandidaturFormatDarstellung(StimmzettelFormatterKandidaturFormatDarstellung kandidaturFormatDarstellung) {
    this.kandidaturFormatDarstellung = kandidaturFormatDarstellung;
  }

  public FileType getTargetFileType() {
    return targetFileType;
  }

  public void setTargetFileType(FileType targetFileType) {
    this.targetFileType = targetFileType;
  }

  public boolean isTargetCreatedPerWurzelgebiet() {
    return targetCreatedPerWurzelgebiet;
  }

  public void setTargetCreatedPerWurzelgebiet(boolean targetCreatedPerWurzelgebiet) {
    this.targetCreatedPerWurzelgebiet = targetCreatedPerWurzelgebiet;
  }
}
