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

import java.util.Collection;

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.praesentation.entity.PraesentationUploadServiceStatus;
import de.ivu.elect.business.praesentation.entity.PraesentationUploadServiceTyp;
import de.ivu.elect.business.wahl.control.AbstractWahlParameterInit;
import de.ivu.elect.business.wahl.entity.Wahl;
import de.ivu.elect.business.wahl.entity.WahlParameter;
import de.ivu.elect.business.wahl.entity.Wahltermin;


import static de.ivu.elect.business.wahl.entity.WahlParameterWerte.PREASENTATIION_ANZAHL_RENDER_THREADS;
import static de.ivu.elect.business.wahl.entity.WahlParameterWerte.PREASENTATIION_ASYNCHRONE_BEREITSTELLUNG_NOTWENDIG;
import static de.ivu.elect.business.wahl.entity.WahlParameterWerte.PREASENTATIION_AUTOMATISCHEN_EXPORT_ANSTOSSEN;
import static de.ivu.elect.business.wahl.entity.WahlParameterWerte.PREASENTATIION_ERFASSUNGSGEBIETE_PRO_WAHLGEBIET_NOTWENDIG;
import static de.ivu.elect.business.wahl.entity.WahlParameterWerte.PREASENTATIION_ERFASSUNGSGEBIETE_ZURUECKHALTEN;
import static de.ivu.elect.business.wahl.entity.WahlParameterWerte.PREASENTATIION_INTERNET_SEITEN_AUS_DOKUMENTVORLAGE_VERWENDEN;
import static de.ivu.elect.business.wahl.entity.WahlParameterWerte.PREASENTATIION_STATUS;
import static de.ivu.elect.business.wahl.entity.WahlParameterWerte.PREASENTATIION_UPLOAD_SERVICE_BENUTZER;
import static de.ivu.elect.business.wahl.entity.WahlParameterWerte.PREASENTATIION_UPLOAD_SERVICE_KONFIG;
import static de.ivu.elect.business.wahl.entity.WahlParameterWerte.PREASENTATIION_UPLOAD_SERVICE_PASSWORT;
import static de.ivu.elect.business.wahl.entity.WahlParameterWerte.PREASENTATIION_UPLOAD_SERVICE_STATUS;
import static de.ivu.elect.business.wahl.entity.WahlParameterWerte.PREASENTATIION_UPLOAD_SERVICE_TYP;
import static de.ivu.elect.business.wahl.entity.WahlParameterWerte.PREASENTATIION_UPLOAD_SERVICE_URL;
import static de.ivu.elect.business.wahl.entity.WahlParameterWerte.PREASENTATIION_URL;
import static java.util.Arrays.asList;

public class PraesentationWahlParameterInit extends AbstractWahlParameterInit {

  public PraesentationWahlParameterInit() {
    super();
  }

  @Override
  public Collection<WahlParameter> createDefaultParameters(Wahltermin wahltermin, Wahl wahl) {

    return asList( //
        create(PREASENTATIION_STATUS, getStatusDefault(wahl)),
        create(PREASENTATIION_AUTOMATISCHEN_EXPORT_ANSTOSSEN, getAutomatischerExportDefault(wahl)),
        create(PREASENTATIION_ERFASSUNGSGEBIETE_ZURUECKHALTEN, getPraesentationErfassungsgebieteZurueckhaltenDefault(wahl)),
        create(PREASENTATIION_ERFASSUNGSGEBIETE_PRO_WAHLGEBIET_NOTWENDIG, getPraesentationErfassungsgebieteProWahlgebietDefault(wahl)),
        create(PREASENTATIION_ANZAHL_RENDER_THREADS, 1 /* TODO ELECT-7650 getAnzahlRenderThreads()*/),
        create(PREASENTATIION_ASYNCHRONE_BEREITSTELLUNG_NOTWENDIG, ""),
        create(PREASENTATIION_UPLOAD_SERVICE_STATUS, PraesentationUploadServiceStatus.DEAKTIVIERT.name()),
        create(PREASENTATIION_UPLOAD_SERVICE_TYP, PraesentationUploadServiceTyp.DEAKTIVIERT.name()),
        create(PREASENTATIION_UPLOAD_SERVICE_URL, ""),
        create(PREASENTATIION_UPLOAD_SERVICE_BENUTZER, ""),
        create(PREASENTATIION_UPLOAD_SERVICE_PASSWORT, ""),
        create(PREASENTATIION_UPLOAD_SERVICE_KONFIG, ""),
        create(PREASENTATIION_INTERNET_SEITEN_AUS_DOKUMENTVORLAGE_VERWENDEN, getInternetSeitenAusVorlageVerwendenDefault()),
        create(PREASENTATIION_URL,"" )
    );
  }

  protected Boolean getInternetSeitenAusVorlageVerwendenDefault() {
    return Boolean.FALSE /*ELECTKOM-996*/;
  }

  protected Long getPraesentationErfassungsgebieteProWahlgebietDefault(Wahl wahl) {
    return null;
  }

  private String getAnzahlRenderThreads() {
    return Integer.toString(Math.max(1, (int) Math.round(Runtime.getRuntime().availableProcessors() / 4.0d))); // ein Viertel der Kapazität fürs Erstellen der Präsentation nehmen

  }

  protected PraesentationAutomatischenExportAnstossen getAutomatischerExportDefault(Wahl wahl) {
    if (PraesentationBereitstellen.DEAKTIVIERT.equals(getStatusDefault(wahl))){
      return PraesentationAutomatischenExportAnstossen.DEAKTIVIERT;
    }
    return PraesentationAutomatischenExportAnstossen.NACH_FREIGABE_GEBIET_UND_NACH_ZURUECKSETZEN;
  }

  protected PraesentationErfassungsgebieteZurueckhalten getPraesentationErfassungsgebieteZurueckhaltenDefault(Wahl wahl) {
    return PraesentationErfassungsgebieteZurueckhalten.NICHT_ZURUECKHALTEN;
  }

  protected PraesentationBereitstellen getStatusDefault(Wahl wahl) {
    return PraesentationBereitstellen.VOLLSTAENDIG;
  }
}
