
package de.ivu.elect.business.internet.entity;

import java.io.Serializable;

import javax.annotation.Nullable;

import de.ivu.elect.business.dokumente.entity.DokumentVorlage;
import de.ivu.elect.business.ergebnis.entity.Ergebnis;
import de.ivu.elect.business.internet.control.PraesentationBereitstellenService;
import de.ivu.elect.business.konfiguration.entity.ElectKonfigurationWerte;
import de.ivu.elect.business.konfiguration.entity.KonfigurationConstants;
import de.ivu.elect.business.praesentation.entity.PraesentationAutomatischenExportAnstossen;
import de.ivu.elect.business.praesentation.entity.PraesentationBereitstellen;
import de.ivu.elect.business.praesentation.entity.PraesentationErfassungsgebieteZurueckhalten;
import de.ivu.elect.business.wahl.entity.WahlPK;
import de.ivu.elect.jee.faces.Messages;
import de.ivu.elect.jee.presentation.dynamicform.AbstractBooleanProperty;
import de.ivu.elect.jee.presentation.dynamicform.AbstractIntegerProperty;
import de.ivu.elect.jee.presentation.dynamicform.AbstractStringProperty;
import de.ivu.elect.jee.presentation.dynamicform.Property;

public class PraesentationKonfiguration implements Serializable {

  private static final long serialVersionUID = 1L;

  private boolean internetPraesentationAutomatischGenerieren;

  private String ausgabeverzeichnis;

  private final WahlPK wahlPK;

  private Integer minimalePauseInSekundenZwischenZweiExporten;

  private boolean alsZipDateiAblegen;

  private final DokumentVorlage dokumentVorlage;

  private Long praesentationErfassungsgebieteNotwendig;

  private PraesentationErfassungsgebieteZurueckhalten praesentationErfassungsgebieteZurueckhalten;

  private PraesentationAutomatischenExportAnstossen praesentationAutomatischenExportAnstossen;

  private String praesentationUrl;

  private PraesentationBereitstellen praesentationBereitstellen;

  public PraesentationKonfiguration(boolean internetPraesentationAutomatischGenerieren, String ausgabeverzeichnis, WahlPK wahlPK,
                                    int minimalePauseInSekundenZwischenZweiExporten, boolean alsZipDateiAblegen, @Nullable DokumentVorlage dokumentVorlage,
                                    Long praesentationErfassungsgebieteNotwendig, PraesentationErfassungsgebieteZurueckhalten praesentationErfassungsgebieteZurueckhalten,
                                    PraesentationAutomatischenExportAnstossen praesentationAutomatischenExportAnstossen, String praesentationUrl,
                                    PraesentationBereitstellen praesentationBereitstellen) {
    this.internetPraesentationAutomatischGenerieren = internetPraesentationAutomatischGenerieren;
    this.ausgabeverzeichnis = ausgabeverzeichnis;
    this.wahlPK = wahlPK;
    this.minimalePauseInSekundenZwischenZweiExporten = minimalePauseInSekundenZwischenZweiExporten;
    this.alsZipDateiAblegen=alsZipDateiAblegen;
    this.dokumentVorlage = dokumentVorlage;
    this.praesentationErfassungsgebieteNotwendig = praesentationErfassungsgebieteNotwendig;
    this.praesentationErfassungsgebieteZurueckhalten = praesentationErfassungsgebieteZurueckhalten;
    this.praesentationAutomatischenExportAnstossen = praesentationAutomatischenExportAnstossen;
    this.praesentationUrl = praesentationUrl;
    this.praesentationBereitstellen = praesentationBereitstellen;
  }

  public boolean isInternetPraesentationAutomatischGenerieren() {
    return internetPraesentationAutomatischGenerieren;
  }

  public void setInternetPraesentationAutomatischGenerieren(boolean internetPraesentationAutomatischGenerieren) {
    this.internetPraesentationAutomatischGenerieren = internetPraesentationAutomatischGenerieren;
  }

  public void setAusgabeverzeichnis(String ausgabeverzeichnis) {
    this.ausgabeverzeichnis = ausgabeverzeichnis;
  }

  public Integer getMinimalePauseInSekundenZwischenZweiExporten() {
    return minimalePauseInSekundenZwischenZweiExporten;
  }

  public void setMinimalePauseInSekundenZwischenZweiExporten(Integer minimalePauseInSekundenZwischenZweiExporten) {
    this.minimalePauseInSekundenZwischenZweiExporten = minimalePauseInSekundenZwischenZweiExporten;
  }

  public String getAusgabeverzeichnis() {
    return ausgabeverzeichnis;
  }

  public Property getInternetAktiviertProperty(final Messages messages) {

    return new AbstractBooleanProperty() {

      @Override
      public Boolean getValue() {
        return isInternetPraesentationAutomatischGenerieren();
      }

      @Override
      public void setValue(Boolean aBoolean) {
        setInternetPraesentationAutomatischGenerieren(aBoolean);
      }

      @Override
      public String getDefaultLabel() {
        return messages.lokalisiere(ElectKonfigurationWerte.PRAESENTATION_EXPORT_INTERNET_AKTIVIERT);
      }

      @Override
      public boolean getDefaultRequired() {
        return false;
      }
    };

  }

  public Property getAlsZipDateiAblegenProperty(final Messages messages) {

    return new AbstractBooleanProperty() {

      @Override
      public Boolean getValue() {
        return alsZipDateiAblegen;
      }

      @Override
      public void setValue(Boolean aBoolean) {
        throw new UnsupportedOperationException(); // nur über Systemkonfiguration
      }

      @Override
      public String getDefaultLabel() {
        return messages.lokalisiere(ElectKonfigurationWerte.PRAESENTATION_EXPORT_ALS_ZIP_DATEI);
      }

      @Override
      public boolean getDefaultRequired() {
        return false;
      }

      @Override
      public boolean isReadonly() {
        return true; // nur über Systemkonfiguration
      }
    };

  }

  public Property getMinimalePauseInSekundenZwischenZweiExportenProperty(final Messages messages) {

    return new AbstractIntegerProperty() {

      @Override
      public Integer getValue() {
        return getMinimalePauseInSekundenZwischenZweiExporten();
      }

      @Override
      public void setValue(Integer integer) {
        setMinimalePauseInSekundenZwischenZweiExporten(integer);
      }

      @Override
      public String getDefaultLabel() {
        return messages.lokalisiere(ElectKonfigurationWerte.PRAESENTATION_EXPORT_INTERNET_MINIMALE_PAUSE_IN_SEKUNDEN);
      }

      @Override
      public boolean getDefaultRequired() {
        return false;
      }
    };

  }

  public Property getAusgabeverzeichnisProperty(final Messages messages) {

    return new AbstractStringProperty() {

      @Override
      public String getValue() {
        return getAusgabeverzeichnis();
      }

      @Override
      public void setValue(String s) {
        setAusgabeverzeichnis(s);
      }

      @Override
      public int getDefaultMaxLength() {
        return KonfigurationConstants.WERT_MAX_LENGTH;
      }

      @Override
      public String getDefaultLabel() {
        return messages.lokalisiere(ElectKonfigurationWerte.PRAESENTATION_EXPORT_ABLAGEVERZEICHNIS);
      }

      @Override
      public boolean getDefaultRequired() {
        return true;
      }
    };
  }

  public Property getAusgabeverzeichnisInternetFinalProperty(final Messages messages, final Ergebnis entity) {
    return new AbstractStringProperty() {

      @Override
      public String getValue() {
        return PraesentationBereitstellenService.bestimmeZielverzeichnis(/*Praesentationsexportart.INTERNET,*/
            getAusgabeverzeichnis(), entity/*, Stimmabgabeart.GESAMT*/);
      }

      @Override
      public void setValue(String s) {
        throw new UnsupportedOperationException();
      }

      @Override
      public int getDefaultMaxLength() {
        return 0;
      }

      @Override
      public String getDefaultLabel() {
        return messages.getMessageForMessageKey("praesentation.konfiguration.ausgabeverzeichnis.internet");
      }

      @Override
      public boolean getDefaultRequired() {
        return false;
      }
    };
  }

  public boolean isAlsZipDateiAblegen() {
    return alsZipDateiAblegen;
  }


  public DokumentVorlage getDokumentVorlage() {
    return dokumentVorlage;
  }

  public WahlPK getWahlPK() {
    return wahlPK;
  }

  public PraesentationErfassungsgebieteZurueckhalten getPraesentationErfassungsgebieteZurueckhalten() {
    return praesentationErfassungsgebieteZurueckhalten;
  }

  public void setPraesentationErfassungsgebieteZurueckhalten(PraesentationErfassungsgebieteZurueckhalten praesentationErfassungsgebieteZurueckhalten) {
    this.praesentationErfassungsgebieteZurueckhalten = praesentationErfassungsgebieteZurueckhalten;
  }

  public PraesentationAutomatischenExportAnstossen getPraesentationAutomatischenExportAnstossen() {
    return praesentationAutomatischenExportAnstossen;
  }

  public void setPraesentationAutomatischenExportAnstossen(PraesentationAutomatischenExportAnstossen praesentationAutomatischenExportAnstossen) {
    this.praesentationAutomatischenExportAnstossen = praesentationAutomatischenExportAnstossen;
  }

  public Long getPraesentationErfassungsgebieteNotwendig() {
    return praesentationErfassungsgebieteNotwendig;
  }

  public void setPraesentationErfassungsgebieteNotwendig(Long praesentationErfassungsgebieteNotwendig) {
    this.praesentationErfassungsgebieteNotwendig = praesentationErfassungsgebieteNotwendig;
  }

  public String getPraesentationUrl() {
    return praesentationUrl;
  }

  public void setPraesentationUrl(String praesentationUrl) {
    this.praesentationUrl = praesentationUrl;
  }

  public PraesentationBereitstellen getPraesentationBereitstellen() {
    return praesentationBereitstellen;
  }

  public void setPraesentationBereitstellen(PraesentationBereitstellen praesentationBereitstellen) {
    this.praesentationBereitstellen = praesentationBereitstellen;
  }
}
