
package de.ivu.elect.presentation.wahlvorschlag;

import static java.util.Collections.singletonList;

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.person.boundary.PersonendatenFactory;
import de.ivu.elect.business.security.UseCasePermission;
import de.ivu.elect.business.wahlvorschlag.boundary.WahlvorschlagEmpfangsquittungDokumentContext;
import de.ivu.elect.business.wahlvorschlag.boundary.WahlvorschlagEmpfangsquittungDokumentGenerator;
import de.ivu.elect.business.wahlvorschlag.entity.Wahlvorschlag;
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.dokumente.AbstractDokumentErzeugenView;
import de.ivu.elect.presentation.dokumente.ElectDokumentContextGenerator;
import de.ivu.elect.presentation.hilfe.OnlineHilfeId;
import de.ivu.elect.presentation.wahlvorschlag.form.WahlvorschlagEmpfangsquittungDokumentErzeugenViewFormBuilder;

@GroupedConversationScoped
@OnlineHilfeId("193")
@ConversationGroup(WahlvorschlagEmpfangsquittungDokumentErzeugenView.class)
@Named(WahlvorschlagEmpfangsquittungDokumentErzeugenView.COMPONENT_NAME)
@View(viewId = WahlvorschlagEmpfangsquittungDokumentErzeugenView.VIEW_ID, useCase = UseCasePermission.DOKUMENT_ERZEUGEN_WAHLVORSCHLAG_EMPFANGSQUITTUNG)
public class WahlvorschlagEmpfangsquittungDokumentErzeugenView extends AbstractDokumentErzeugenView<Wahlvorschlag, WahlvorschlagEmpfangsquittungDokumentContext> {

  private static final long serialVersionUID = 1L;

  public static final String COMPONENT_NAME = "wahlvorschlagEmpfangsquittungDokumentErzeugenView";

  public static final String VIEW_ID = "/wahlvorschlag/wahlvorschlag-empfangsquittung-dokument-erzeugen.xhtml";

  public static final String PARENT_VIEW_ID = WahlvorschlagSearchView.VIEW_ID;

  @Inject
  private transient PersonendatenFactory personendatenFactory;

  @Inject
  private transient ElectDokumentContextGenerator electDokumentContextGenerator;

  @Inject
  private transient WahlvorschlagEmpfangsquittungDokumentGenerator wahlvorschlagEmpfangsquittungDokumentGenerator;

  @Inject
  private transient WahlvorschlagEmpfangsquittungDokumentErzeugenViewFormBuilder wahlvorschlagEmpfangsquittungDokumentErzeugenViewFormBuilder;

  private Wahlvorschlag wahlvorschlag;

  private WahlvorschlagEmpfangsquittungDokumentContext context;

  private AdvancedDynaFormModel dokumentErzeugenParametersModel;

  public WahlvorschlagEmpfangsquittungDokumentErzeugenView() {
    super();
  }

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

  public String getParentViewId() {
    return PARENT_VIEW_ID;
  }

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

  public String init(Wahlvorschlag wahlvorschlag) {
    this.wahlvorschlag = wahlvorschlag;

    this.context = null;

    this.dokumentErzeugenParametersModel = null;

    return init(singletonList(wahlvorschlag));
  }

  public boolean isDokumentErzeugungMoeglich() {
    return getDokumentGenerator().isDokumentErzeugungMoeglich();
  }

  @Override
  protected WahlvorschlagEmpfangsquittungDokumentContext getContext() {
    if (context == null) {
      context = new WahlvorschlagEmpfangsquittungDokumentContext(electDokumentContextGenerator.createElectDokumentContext(), principal.getFormattedName(), wahlvorschlag,
          personendatenFactory.create());
    }

    return context;
  }

  @Override
  protected AbstractDokumentGenerator<Wahlvorschlag, WahlvorschlagEmpfangsquittungDokumentContext> getDokumentGenerator() {
    return wahlvorschlagEmpfangsquittungDokumentGenerator;
  }

  public AdvancedDynaFormModel getModel() {
    if (dokumentErzeugenParametersModel == null) {
      dokumentErzeugenParametersModel = createModel();
    }

    return dokumentErzeugenParametersModel;
  }

  private AdvancedDynaFormModel createModel() {
    FormBuilder formBuilder = new FormBuilder();

    wahlvorschlagEmpfangsquittungDokumentErzeugenViewFormBuilder.addProperties(formBuilder, getContext());

    return formBuilder.createModel();
  }

  @Override
  public boolean isBtnGoBackRendered() {
    return true;
  }

  @Redirect
  @Override
  public String goBack() {
    return getParentViewId(); // Kein "Standard"-GoBack wg. Endlosschleife, siehe ELECT-9634
  }
}
