package de.ivu.elect.presentation.wahlbeteiligung;

import javax.annotation.Nullable;
import javax.enterprise.context.RequestScoped;
import javax.inject.Inject;
import javax.inject.Named;

import de.ivu.elect.business.security.UseCasePermission;
import de.ivu.elect.business.wahlbeteiligung.boundary.WahlbeteiligungAuswertungConversationSelect;
import de.ivu.elect.business.wahlbeteiligung.boundary.WahlbeteiligungVerlaufConversationSelect;
import de.ivu.elect.business.wahlbeteiligung.boundary.WasWahlbeteiligungVerlaufBoundaryCreate;
import de.ivu.elect.business.wahlbeteiligung.entity.WahlbeteiligungAuswertung;
import de.ivu.elect.business.wahlbeteiligung.entity.WahlbeteiligungVerlauf;
import de.ivu.elect.business.wahlbeteiligung.entity.WahlbeteiligungVerlaufStatus;
import de.ivu.elect.business.wahlbeteiligung.entity.WahlbeteiligungVerlaufTyp;
import de.ivu.elect.jee.faces.PreConditionCheck;
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.hilfe.OnlineHilfeId;
import de.ivu.elect.presentation.wahlbeteiligung.form.WahlbeteiligungVerlaufViewFormBuilder;

@RequestScoped
@Named(WahlbeteiligungVerlaufAusAuswertungCreateView.COMPONENT_NAME)
@View(viewId = WahlbeteiligungVerlaufAusAuswertungCreateView.VIEW_ID, useCase = UseCasePermission.WAHLBETEILIGUNG_VERLAUF_AUS_AUSWERTUNG_CREATE)
@OnlineHilfeId("764")
public class WahlbeteiligungVerlaufAusAuswertungCreateView extends AbstractWahlbeteiligungVerlaufCreateNoScopeView {

  public static final String COMPONENT_NAME = "wahlbeteiligungVerlaufAusAuswertungCreateView";

  public static final String VIEW_ID = "/wahlbeteiligung/wahlbeteiligung-verlauf-aus-auswertung-create.xhtml";

  private static final long serialVersionUID = 1L;

  @Inject
  protected transient WasWahlbeteiligungVerlaufBoundaryCreate create;

  @Inject
  private transient WahlbeteiligungVerlaufViewFormBuilder viewFormBuilder;

  @Inject
  private transient WahlbeteiligungAuswertungConversationSelect wahlbeteiligungAuswertungConversationSelect;

  @Inject
  private transient WahlbeteiligungVerlaufConversationSelect wahlbeteiligungVerlaufConversationSelect;

  @Nullable
  @PreConditionCheck
  public String checkCondition() {
    if (!isWahlSelected() || !wahlbeteiligungAuswertungConversationSelect.isSelected() || !wahlbeteiligungAuswertungConversationSelect.getEntity().getWahl()
        .equals(getSelectedWahl())) {
      return getStartViewId();
    }

    return null;
  }

  @Override
  protected void setEntity(WahlbeteiligungVerlauf entity) {
    super.setEntity(entity);
    entity.setStatus(WahlbeteiligungVerlaufStatus.AUTOMATISCH_ERMITTELT);
    entity.setTyp(WahlbeteiligungVerlaufTyp.TAGESVERLAUF);
    if (getSelectedWahl() != null) {
      entity.setName(getSelectedWahl().getName());
    }
    WahlbeteiligungAuswertung wahlbeteiligungAuswertung = wahlbeteiligungAuswertungConversationSelect.getEntity();
    if (wahlbeteiligungAuswertung != null) {
      entity.setDatum(wahlbeteiligungAuswertung.getDatum());
      entity.setBemerkung(wahlbeteiligungAuswertung.getBemerkung());
    }
  }

  @Override
  public void addProperties(FormBuilder formBuilder, WahlbeteiligungVerlauf entity) {
    viewFormBuilder.addProperties(formBuilder, getEntity());
  }

  @Override
  @Redirect
  public String save() {
    String result = super.save();
    if (hasPermission(UseCasePermission.WAHLBETEILIGUNG_VERLAUF_GEBIET_SEARCH)) {
      return WahlbeteiligungVerlaufGebietSearchView.VIEW_ID;
    }
    return result;
  }

  @Override
  protected void callSave(WahlbeteiligungVerlauf entity) {
    getEntity().setWahl(getSelectedWahl());
    getEntity().setWahl(wahlbeteiligungAuswertungConversationSelect.getEntity().getWahl());
    create.save(entity, wahlbeteiligungAuswertungConversationSelect.getEntity());
    wahlbeteiligungVerlaufConversationSelect.setEntity(getEntity());
  }

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

}
