
package de.ivu.elect.presentation.stimmeingabe;

import static java.util.Arrays.asList;

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.dokumente.boundary.AbstractDokumentGenerator;
import de.ivu.elect.business.ergebnis.control.ErgebnisExchangeContext;
import de.ivu.elect.business.security.UseCasePermission;
import de.ivu.elect.business.stimmeingabe.boundary.StimmeingabeDocumentByErgebniseingangDokumentGenerator;
import de.ivu.elect.business.stimmeingabe.control.StimmeingabeDocumentByErgebniseingangExportContext;
import de.ivu.elect.business.stimmeingabe.control.WasStimmeingabeDocumentByErgebniseingangExportObject;
import de.ivu.elect.business.stimmeingabe.entity.Ergebniseingang;
import de.ivu.elect.business.wahl.boundary.WahldurchfuehrungSessionSelect;
import de.ivu.elect.business.wahl.entity.Wahldurchfuehrung;
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.dokumente.AbstractDokumentErzeugenView;
import de.ivu.elect.presentation.dokumente.ElectDokumentContextGenerator;

@GroupedConversationScoped
@ConversationGroup(ErgebniseingangDokumentErzeugenView.class)
@Named(ErgebniseingangDokumentErzeugenView.COMPONENT_NAME)
@View(viewId = ErgebniseingangDokumentErzeugenView.VIEW_ID, useCase = UseCasePermission.DOKUMENT_ERZEUGEN_NIEDERSCHRIFT)
public class ErgebniseingangDokumentErzeugenView
    extends
      AbstractDokumentErzeugenView</* List<WasStimmeingabeDocumentByErgebniseingangExportObject> Import von java.util.List führt zu WELD Bug (!!) */Object, StimmeingabeDocumentByErgebniseingangExportContext> {

  private static final long serialVersionUID = 1L;

  public static final String COMPONENT_NAME = "ergebniseingangDokumentErzeugenView";

  public static final String VIEW_ID = "/stimmeingabe/ergebniseingang-dokument-erzeugen-view.xhtml";

  @Inject
  private transient WahldurchfuehrungSessionSelect wahldurchfuehrungSessionSelect;

  @Inject
  private transient ElectDokumentContextGenerator electDokumentContextGenerator;

  @Inject
  private transient StimmeingabeDocumentByErgebniseingangDokumentGenerator stimmeingabeDocumentByErgebniseingangDokumentGenerator;

  public ErgebniseingangDokumentErzeugenView() {
    super();
  }

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

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

  @Redirect
  public String initErgebniseingang(Ergebniseingang ergebniseingang) {
    return initErgebniseingaenge(asList(ergebniseingang));
  }

  @Redirect
  private String initErgebniseingaenge(List<Ergebniseingang> ergebniseingaenge) {
    List<WasStimmeingabeDocumentByErgebniseingangExportObject> exportObjects = asList(new WasStimmeingabeDocumentByErgebniseingangExportObject(ergebniseingaenge));
    exportObjects.forEach(exportObject -> exportObject.getErgebniseingaenge().forEach(Ergebniseingang::getPk));

    return super.init((List) exportObjects); // Generics Quatsch
  }

  @Override
  protected AbstractDokumentGenerator<Object, StimmeingabeDocumentByErgebniseingangExportContext> getDokumentGenerator() {
    return (AbstractDokumentGenerator) stimmeingabeDocumentByErgebniseingangDokumentGenerator;
  }

  @Override
  protected void addDokumentParameterProperties(FormBuilder formBuilder) {
    // Add nothing...
  }

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

    return new StimmeingabeDocumentByErgebniseingangExportContext(electDokumentContextGenerator.createElectDokumentContext(),
        new ErgebnisExchangeContext(wahldurchfuehrung, getSelectedGebiet(), ErgebnisExchangeContext.KANDIDATUR_FORMAT_DARSTELLUNG_NOT_CONFIGURED), wahldurchfuehrung.getErgebniseingangsart(),
        getSelectedDokumentVorlage(), false, sectionsNurEinzelnesWahldurchfuehrungsgebietExcluded, sectionsNurEinzelnesWahldurchfuehrungsgebietExcluded, false);
  }
}
