
package de.ivu.elect.presentation.ergebnis.dokumente.wahlbuch;

import static java.util.Arrays.asList;
import static java.util.Collections.singletonList;

import java.util.List;

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

import org.apache.deltaspike.core.api.scope.ConversationGroup;
import org.apache.deltaspike.core.api.scope.GroupedConversationScoped;

import de.ivu.elect.business.ergebnis.boundary.AbstractWahlbuchDokumentGenerator;
import de.ivu.elect.business.ergebnis.boundary.ErgebnisSessionSelect;
import de.ivu.elect.business.ergebnis.boundary.WahlbuchDokumentContext;
import de.ivu.elect.business.ergebnis.boundary.WahlbuchDokumentGenerator;
import de.ivu.elect.business.ergebnis.boundary.WahlbuchReferendumDokumentGenerator;
import de.ivu.elect.business.ergebnis.entity.Ergebnis;
import de.ivu.elect.business.ergebnis.entity.WahlbuchDokumentEinschraenkung;
import de.ivu.elect.business.security.UseCasePermission;
import de.ivu.elect.business.stimmeingabe.boundary.ErgebniseingangKonfiguration;
import de.ivu.elect.jee.faces.PreConditionCheck;
import de.ivu.elect.jee.presentation.dynamicform.FormBuilder;
import de.ivu.elect.jee.presentation.dynamicform.LambdaEnumProperty;
import de.ivu.elect.presentation.View;
import de.ivu.elect.presentation.dokumente.AbstractDokumentErzeugenView;
import de.ivu.elect.presentation.dokumente.ElectDokumentContextGenerator;
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.hilfe.OnlineHilfeId;

@OnlineHilfeId("694")
@GroupedConversationScoped
@ConversationGroup(WahlbuchDokumentErzeugenView.class)
@Named(WahlbuchDokumentErzeugenView.COMPONENT_NAME)
@View(viewId = WahlbuchDokumentErzeugenView.VIEW_ID, useCase = UseCasePermission.DOKUMENT_ERZEUGEN_WAHLBUCH)
public class WahlbuchDokumentErzeugenView extends AbstractDokumentErzeugenView<Ergebnis, WahlbuchDokumentContext> implements ViewHavingErgebnisStatusInfo {

  private static final long serialVersionUID = 1L;

  public static final String COMPONENT_NAME = "wahlbuchDokumentErzeugenView";

  public static final String VIEW_ID = "/ergebnis/wahlbuch-dokument-erzeugen-view.xhtml";

  @Inject
  private transient ErgebnisSessionSelect ergebnisSessionSelect;

  @Inject
  private transient ErgebniseingangKonfiguration ergebniseingangKonfiguration;

  @Inject
  private transient ElectDokumentContextGenerator electDokumentContextGenerator;

  @Inject
  private transient WahlbuchDokumentGenerator wahlbuchDokumentGenerator;

  @Inject
  private transient WahlbuchReferendumDokumentGenerator wahlbuchReferendumDokumentGenerator;

  private WahlbuchDokumentEinschraenkung wahlbuchDokumentEinschraenkung;

  public WahlbuchDokumentErzeugenView() {
    super();

    this.wahlbuchDokumentEinschraenkung = WahlbuchDokumentEinschraenkung.VOLLSTAENDIG;
  }

  @Override
  @PreConditionCheck
  public String checkPreCondition() {
    if (isErgebnisSelected()) {
      return super.checkPreCondition();
    }

    return startViewResolver.getStartViewId();
  }

  @Override
  protected UseCasePermission getRequiredPermission() {
    return UseCasePermission.DOKUMENT_ERZEUGEN_WAHLBUCH;
  }

  @Override
  public String getViewId() {
    return VIEW_ID;
  }

  @Override
  protected List<Ergebnis> getEntities() {
    return singletonList(getSelectedErgebnis());
  }

  @Override
  protected AbstractWahlbuchDokumentGenerator getDokumentGenerator() {
    if (isWahlSelected() && getSelectedWahl().isReferendum()) {
      return wahlbuchReferendumDokumentGenerator;
    }

    return wahlbuchDokumentGenerator;
  }

  @Override
  protected WahlbuchDokumentContext getContext() {
    return new WahlbuchDokumentContext(electDokumentContextGenerator.createElectDokumentContext(), getSelectedErgebnis(), getWahlbuchDokumentEinschraenkung());
  }

  @Override
  public void addDokumentParameterProperties(FormBuilder formBuilder) {
    super.addDokumentParameterProperties(formBuilder);

    formBuilder.addProperty(new LambdaEnumProperty<>(getMessage("wahlbuch.dokument.erzeugen.option.dokument.einschraenken"), false, this::setWahlbuchDokumentEinschraenkung,
        this::getWahlbuchDokumentEinschraenkung, WahlbuchDokumentEinschraenkung.class, asList(WahlbuchDokumentEinschraenkung.values())));
  }

  @Override
  public boolean isSearchResultRendered() {
    return true; // ELECT-11847
  }

  public WahlbuchDokumentEinschraenkung getWahlbuchDokumentEinschraenkung() {
    return wahlbuchDokumentEinschraenkung;
  }

  public void setWahlbuchDokumentEinschraenkung(WahlbuchDokumentEinschraenkung wahlbuchDokumentEinschraenkung) {
    this.wahlbuchDokumentEinschraenkung = wahlbuchDokumentEinschraenkung;
  }

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

  private boolean isErgebnisSelected() {
    return ergebnisSessionSelect.isSelected();
  }

  private Ergebnis getSelectedErgebnis() {
    return ergebnisSessionSelect.getEntity();
  }

  @Override
  protected void resetDokumentGenerieren() {
    this.wahlbuchDokumentEinschraenkung = WahlbuchDokumentEinschraenkung.VOLLSTAENDIG;

    super.resetDokumentGenerieren();
  }
}
