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

import javax.inject.Inject;
import javax.inject.Named;

import de.ivu.elect.business.dokumente.entity.DokumentVorlage;
import de.ivu.elect.business.dokumente.entity.DokumentVorlageArt;
import de.ivu.elect.business.ergebnis.boundary.ErgebnisSessionSelect;
import de.ivu.elect.business.ergebnis.control.ErgebnisExchangeContext;
import de.ivu.elect.business.ergebnis.entity.Ergebnis;
import de.ivu.elect.business.ergebnis.entity.Ergebnisart;
import de.ivu.elect.business.exchange.control.FileFormat;
import de.ivu.elect.business.security.UseCasePermission;
import de.ivu.elect.business.stimmeingabe.boundary.ErgebniseingangKonfiguration;
import de.ivu.elect.business.stimmeingabe.boundary.StimmeingabeDocumentByErgebniseingangExporter;
import de.ivu.elect.business.stimmeingabe.control.StimmeingabeDocumentByErgebniseingangExportContext;
import de.ivu.elect.business.stimmeingabe.control.WasStimmeingabeDocumentByErgebniseingangExportObject;
import de.ivu.elect.business.wahl.boundary.WahldurchfuehrungSessionSelect;
import de.ivu.elect.business.wahl.entity.Wahldurchfuehrung;
import de.ivu.elect.jee.exception.ElectCommonException;
import de.ivu.elect.jee.presentation.dynamicform.AdvancedDynaFormModel;
import de.ivu.elect.jee.presentation.dynamicform.FormBuilder;
import de.ivu.elect.jee.presentation.redirect.Redirect;
import de.ivu.elect.presentation.View;
import de.ivu.elect.presentation.ergebnis.ErgebnisStatusInfo;
import de.ivu.elect.presentation.ergebnis.ViewHavingErgebnisStatusInfo;
import de.ivu.elect.presentation.ergebnis.WasErgebnisStatusInfo;
import de.ivu.elect.presentation.exchange.AbstractDokumentExportSearchView;
import de.ivu.elect.presentation.hilfe.OnlineHilfeId;

@OnlineHilfeId(value = "277", mehrfachVergebenOk = true)
@Named(StimmeingabeDocumentByErgebniseingangExportView.COMPONENT_NAME)
@View(viewId = StimmeingabeDocumentByErgebniseingangExportView.VIEW_ID, useCase = UseCasePermission.DOKUMENT_ERZEUGEN_NIEDERSCHRIFT)
public class StimmeingabeDocumentByErgebniseingangExportView
    extends
      AbstractDokumentExportSearchView<WasStimmeingabeDocumentByErgebniseingangExportObject, StimmeingabeDocumentByErgebniseingangExportContext>
    implements
      ViewHavingErgebnisStatusInfo {

  private static final long serialVersionUID = 1L;

  public static final String COMPONENT_NAME = "stimmeingabeDocumentByErgebniseingangExportView";

  public static final String VIEW_ID = "/stimmeingabe/stimmeingabe-document-by-ergebniseingang-export.xhtml";

  @Inject
  private transient StimmeingabeDocumentByErgebniseingangExporter exporter;

  @Inject
  private transient StimmeingabeDocumentByErgebniseingangExportDescription exportDescription;

  @Inject
  private transient WahldurchfuehrungSessionSelect wahldurchfuehrungSessionSelect;

  @Inject
  private transient ErgebnisSessionSelect ergebnisSessionSelect;

  @Inject
  private transient ErgebniseingangKonfiguration ergebniseingangKonfiguration;

  private FileFormat previousFileFormat;

  private boolean eingabenExcluded = true;

  public StimmeingabeDocumentByErgebniseingangExportView() {
    super();
  }

  public String getPageTitle() {
    return getMessage("stimmeingabe.document.export.page.title");
  }

  public String getPageHeader() {
    return getMessage("stimmeingabe.document.export.by.ergebniseingang.page.header", getSelectedGebietNameFormatted());
  }

  @Override
  public DokumentVorlageArt getDokumentVorlageArt() {
    return getExportDescription().getDokumentVorlageArt();
  }

  @Override
  protected boolean isDokumentVorlageRequired() {
    return getExporter().isDokumentVorlageBenoetigt(getContext(), getSelectedFileFormat());
  }

  @Override
  @Redirect
  public String exportieren() {
    try {
      return super.exportieren();
    } catch (ElectCommonException loggedEx) {
      addErrorMessage("stimmeingabe.document.export.keine.ergebniseingaenge.vorhanden.message");

      return getViewId();
    }
  }

  @Override
  public AdvancedDynaFormModel getExportParameterModel() {
    // ELECTMUC-967: einige veraltete Exporter brauchen keine Dokumentvorlage. Damit beim Umschalten zwischen den Formaten das Dokumentvorlage-Feld
    // ein- und ausgeblendet wird, setzen wir hier bei Änderungen des Dateiformats das Modell zurück.
    if (previousFileFormat == null || !previousFileFormat.equals(getSelectedFileFormat())) {
      resetExportParameterModel();

      previousFileFormat = getSelectedFileFormat();
    }

    return super.getExportParameterModel();
  }

  @Override
  protected void addProperties(FormBuilder formBuilder) {
    super.addProperties(formBuilder);

    formBuilder.addProperty(new WasStimmeingabeDocumentEingabenExcludedProperty(this::setEingabenExcluded, this::isEingabenExcluded));
  }

  @Override
  public StimmeingabeDocumentByErgebniseingangExportDescription getExportDescription() {
    return exportDescription;
  }

  @Override
  protected StimmeingabeDocumentByErgebniseingangExporter getExporter() {
    return exporter;
  }

  @Override
  protected StimmeingabeDocumentByErgebniseingangExportContext getContext() {
    boolean sectionsNurEinzelnesWahldurchfuehrungsgebietExcluded = true; // ELECT-9443, Abschnitte "Zähliste elektronisch", "Stimmzettel per Beschluss", etc. sind nur bei der Generierung für EIN einzelnes Gebiet relevant, cf. ErgebniseingangDokumentErzeugenView#getContext, WesNiederschriftErzeugen#createContext!

    return createContext(new ErgebnisExchangeContext(getSelectedWahl(), getSelectedGebiet(), ErgebnisExchangeContext.KANDIDATUR_FORMAT_DARSTELLUNG_NOT_CONFIGURED), getSelectedErgebnisart(),
        getDokumentVorlage(), false, sectionsNurEinzelnesWahldurchfuehrungsgebietExcluded, sectionsNurEinzelnesWahldurchfuehrungsgebietExcluded, isEingabenExcluded());
  }

  public StimmeingabeDocumentByErgebniseingangExportContext createContext(ErgebnisExchangeContext ergebnisExchangeContext, Ergebnisart ergebnisart, DokumentVorlage dokumentVorlage,
      boolean documentFuerWahlgebietRequired, boolean sectionErfassteStimmzettelExcluded, boolean sectionZaehllisteElektronischExcluded, boolean eingabenExcluded) {
    return new StimmeingabeDocumentByErgebniseingangExportContext(createElectDokumentContext(), ergebnisExchangeContext, ergebnisart, dokumentVorlage, documentFuerWahlgebietRequired,
        sectionErfassteStimmzettelExcluded, sectionZaehllisteElektronischExcluded, eingabenExcluded);
  }

  private boolean isEingabenExcluded() {
    return eingabenExcluded;
  }

  private void setEingabenExcluded(Boolean eingabenExcluded) {
    this.eingabenExcluded = Boolean.TRUE.equals(eingabenExcluded);
  }

  @Override
  public ErgebnisStatusInfo getErgebnisStatusInfo() {
    return new WasErgebnisStatusInfo(getMessages(), getSelectedWahl(), ergebniseingangKonfiguration, getSelectedErgebnisart());
  }

  private Ergebnisart getSelectedErgebnisart() {
    Ergebnis ergebnis = ergebnisSessionSelect.getEntity();

    if (ergebnis == null) {
      return Ergebnisart.TESTDATEN; // Dummy...
    }

    return ergebnis.getErgebnisart();
  }

  @Override
  protected boolean isWahlSelected() {
    return wahldurchfuehrungSessionSelect.isSelected();
  }

  @Override
  protected Wahldurchfuehrung getSelectedWahl() {
    return wahldurchfuehrungSessionSelect.getEntity();
  }
}
