
package de.ivu.elect.presentation.ergebnis.exchange;

import java.util.ArrayList;
import java.util.List;

import javax.inject.Inject;

import org.apache.deltaspike.core.api.scope.ViewAccessScoped;

import de.ivu.elect.business.datei.entity.FileType;
import de.ivu.elect.business.ergebnis.control.AbstractErgebnisExportContext.ErgebnisExportContextBuilder;
import de.ivu.elect.business.ergebnis.control.ErgebnisVerwendung;
import de.ivu.elect.business.ergebnis.entity.Ergebnisart;
import de.ivu.elect.business.ergebnis.entity.WasExportDatenqualitaet;
import de.ivu.elect.business.ergebnis.entity.WasExportErgebnisBezeichnung;
import de.ivu.elect.business.exchange.control.FileFormat;
import de.ivu.elect.presentation.exchange.AbstractExportSearchView;
import de.ivu.elect.util.EnvironmentVariables;


import static de.ivu.elect.business.ergebnis.control.ErgebnisVerwendung.NICHT_BENUTZEN;
import static de.ivu.elect.business.ergebnis.entity.Ergebnisart.VORPERIODE;

@ViewAccessScoped
public abstract class AbstractErgebnisExportSearchView<ExportObject, Context>
    extends
      AbstractExportSearchView<ExportObject, Context> {

  private static final long serialVersionUID = 1L;

  @Inject
  private transient EnvironmentVariables environmentVariables;

  private ErgebnisVerwendung ergebnisVerwendungEingabedaten = ErgebnisVerwendung.VORPERIODE;
  private ErgebnisVerwendung ergebnisVerwendungVergleichswerte = ErgebnisVerwendung.NICHT_BENUTZEN;

  private WasExportErgebnisBezeichnung wasExportErgebnisBezeichnungEingabedaten = WasExportErgebnisBezeichnung.VORPERIODE;
  private WasExportErgebnisBezeichnung wasExportErgebnisBezeichnungVergleichswerte = WasExportErgebnisBezeichnung.KEIN;

  private WasExportDatenqualitaet wasExportDatenqualitaet = WasExportDatenqualitaet.TEST;

  private List<ErgebnisVerwendung> ergebnisVerwendungOptionsEingabedaten;
  private List<ErgebnisVerwendung> ergebnisVerwendungOptionsVergleichswerte;

  protected void buildContext(ErgebnisExportContextBuilder builder) {
    builder.setErgebnisVerwendungEndgueltig(getErgebnisVerwendungEingabedaten());
    builder.setErgebnisVerwendungVergleichswerte(getErgebnisVerwendungVergleichswerte());
    builder.setWasExportEingabeartEndgueltig(getWasExportErgebnisBezeichnungEingabedaten());
    builder.setWasExportEingabeartVergleichswerte(getWasExportErgebnisBezeichnungVergleichswerte());
    builder.setWasExportDatenqualitaet(getWasExportDatenqualitaet());
    builder.setUrsprungsserver(environmentVariables.getServerName());
  }

  /**
   * Gibt Options für selectOneMenu zurück.
   */
  public List<ErgebnisVerwendung> getErgebnisVerwendungOptionsEingabedaten() {
    if (ergebnisVerwendungOptionsEingabedaten == null) {
      ergebnisVerwendungOptionsEingabedaten = new ArrayList<>();
      if (hatDaten(VORPERIODE)) {
        ergebnisVerwendungOptionsEingabedaten.add(ErgebnisVerwendung.VORPERIODE);
      }
      if (hatDaten(Ergebnisart.ENDGUELTIG)) {
        ergebnisVerwendungOptionsEingabedaten.add(ErgebnisVerwendung.ENDGUELTIG);
      }
    }
    // Nicht Benutzen nur anbieten, wenn kein Ergebnis zum Exportieren vorliegt
    if (ergebnisVerwendungOptionsEingabedaten.isEmpty()) {
      ergebnisVerwendungOptionsEingabedaten.add(0, NICHT_BENUTZEN);
    }

    return ergebnisVerwendungOptionsEingabedaten;
  }

  /**
   * Gibt Options für selectOneMenu zurück.
   */
  public List<ErgebnisVerwendung> getErgebnisVerwendungOptionsVergleichswerte() {
    if (ergebnisVerwendungOptionsVergleichswerte == null) {
      ergebnisVerwendungOptionsVergleichswerte = new ArrayList<>();
      ergebnisVerwendungOptionsVergleichswerte.add(NICHT_BENUTZEN);
      if (hatDaten(VORPERIODE)) {
        ergebnisVerwendungOptionsVergleichswerte.add(ErgebnisVerwendung.VORPERIODE);
      }
      if (hatDaten(Ergebnisart.ENDGUELTIG)) {
        ergebnisVerwendungOptionsVergleichswerte.add(ErgebnisVerwendung.ENDGUELTIG);
      }
    }
    return ergebnisVerwendungOptionsVergleichswerte;
  }

  protected abstract boolean hatDaten(Ergebnisart searchedErgebnisart);

  /**
   * Gibt Options für selectOneMenu zurück.
   */
  public WasExportErgebnisBezeichnung[] getExportErgebnisBezeichnungOptionsEingabedaten() {
    if (ergebnisVerwendungEingabedaten.getErgebnisart() == null) {
      return WasExportErgebnisBezeichnung.ohneKein();
    }
    return WasExportErgebnisBezeichnung.ohneKein();
  }

  /**
   * Gibt Options für selectOneMenu zurück.
   */
  public WasExportErgebnisBezeichnung[] getExportErgebnisBezeichnungOptionsVergleichswerte() {
    if (ergebnisVerwendungVergleichswerte.getErgebnisart() == null) {
      return WasExportErgebnisBezeichnung.ohneKein();
    }
    return WasExportErgebnisBezeichnung.ohneKein();
  }

  /**
   * Gibt Options für selectOneMenu zurück.
   */
  public WasExportDatenqualitaet[] getDatenqualitaetOptions() {
    return WasExportDatenqualitaet.values();
  }

  public boolean isXmlExport() {
    FileFormat selectedFileFormat = getSelectedFileFormat();
    if (selectedFileFormat==null) {
      return false;
    }
    FileType fileType = selectedFileFormat.getFileType();
    return fileType.isXmlFile();
  }

  public ErgebnisVerwendung getErgebnisVerwendungEingabedaten() {
    return ergebnisVerwendungEingabedaten;
  }

  public void setErgebnisVerwendungEingabedaten(ErgebnisVerwendung ergebnisVerwendungEingabedaten) {
    this.ergebnisVerwendungEingabedaten = ergebnisVerwendungEingabedaten;
  }

  public ErgebnisVerwendung getErgebnisVerwendungVergleichswerte() {
    return ergebnisVerwendungVergleichswerte;
  }

  public void setErgebnisVerwendungVergleichswerte(ErgebnisVerwendung ergebnisVerwendungVergleichswerte) {
    this.ergebnisVerwendungVergleichswerte = ergebnisVerwendungVergleichswerte;
  }

  public WasExportErgebnisBezeichnung getWasExportErgebnisBezeichnungEingabedaten() {
    if (ergebnisVerwendungEingabedaten.getErgebnisart() == null) {
      return WasExportErgebnisBezeichnung.KEIN;
    }
    return wasExportErgebnisBezeichnungEingabedaten;
  }

  public void setWasExportErgebnisBezeichnungEingabedaten(
      WasExportErgebnisBezeichnung wasExportErgebnisBezeichnungEingabedaten) {
    this.wasExportErgebnisBezeichnungEingabedaten = wasExportErgebnisBezeichnungEingabedaten;
  }

  public WasExportErgebnisBezeichnung getWasExportErgebnisBezeichnungVergleichswerte() {
    if (ergebnisVerwendungVergleichswerte.getErgebnisart() == null) {
      return WasExportErgebnisBezeichnung.KEIN;
    }
    return wasExportErgebnisBezeichnungVergleichswerte;
  }

  public void setWasExportErgebnisBezeichnungVergleichswerte(
      WasExportErgebnisBezeichnung wasExportErgebnisBezeichnungVergleichswerte) {
    this.wasExportErgebnisBezeichnungVergleichswerte = wasExportErgebnisBezeichnungVergleichswerte;
  }

  public WasExportDatenqualitaet getWasExportDatenqualitaet() {
    return wasExportDatenqualitaet;
  }

  public void setWasExportDatenqualitaet(WasExportDatenqualitaet wasExportDatenqualitaet) {
    this.wasExportDatenqualitaet = wasExportDatenqualitaet;
  }
}
