
package de.ivu.elect.presentation.wahlausschuss;

import java.io.Serializable;
import java.util.List;

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

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

import de.ivu.elect.business.gebietsbaum.boundary.GebietNichtAusgewaehltException;
import de.ivu.elect.business.gebietsbaum.boundary.GebietSessionSelect;
import de.ivu.elect.business.security.UseCasePermission;
import de.ivu.elect.business.security.UseCaseSecure;
import de.ivu.elect.business.wahl.boundary.WahlSessionSelect;
import de.ivu.elect.business.wahl.entity.Wahl;
import de.ivu.elect.business.wahlausschuss.boundary.AbstractWahlausschussEntschaedigungSearchParameters;
import de.ivu.elect.business.wahlausschuss.boundary.WahlausschussEntschaedigungEdit;
import de.ivu.elect.business.wahlausschuss.boundary.WahlausschussEntschaedigungSearch;
import de.ivu.elect.business.wahlausschuss.boundary.WahlausschussEntschaedigungSearchParameters;
import de.ivu.elect.business.wahlausschuss.entity.WahlausschussEntschaedigung;
import de.ivu.elect.business.wahlausschuss.entity.WahlausschussEntschaedigungMeta;
import de.ivu.elect.jee.entity.EagerLoadingCollector;
import de.ivu.elect.jee.faces.PreConditionCheck;
import de.ivu.elect.jee.presentation.dynamicform.AdvancedDynaFormModel;
import de.ivu.elect.jee.presentation.dynamicform.FormBuilder;
import de.ivu.elect.jee.presentation.dynamicform.MoneyProperty;
import de.ivu.elect.jee.presentation.redirect.Redirect;
import de.ivu.elect.jee.presentation.view.AbstractView;
import de.ivu.elect.presentation.View;
import de.ivu.elect.presentation.hilfe.OnlineHilfeId;

@RequestScoped
@OnlineHilfeId("395")
@Named(WahlausschussEntschaedigungBulkEditView.COMPONENT_NAME)
@View(viewId = WahlausschussEntschaedigungBulkEditView.VIEW_ID, useCase = UseCasePermission.ENTSCHAEDIGUNGSART_EDIT)
public class WahlausschussEntschaedigungBulkEditView extends AbstractView implements Serializable {

  private static final long serialVersionUID = 1L;

  public static final String VIEW_ID = "/wahlausschuss/wahlausschuss-entschaedigung-bulk-edit.xhtml";

  public static final String PARENT_VIEW_ID = VIEW_ID;

  public static final String COMPONENT_NAME = "wahlausschussEntschaedigungssatzBulkEditView";

  @Inject
  private transient GebietSessionSelect gebietSessionSelect;

  @Inject
  private transient WahlSessionSelect wahlSessionSelect;

  @Inject
  @ConversationGroup(WahlausschussEntschaedigungConversationStore.class)
  private transient WahlausschussEntschaedigungConversationStore wahlausschussEntschaedigungConversationStore;

  @Inject
  private transient WahlausschussEntschaedigungSearch wahlausschussEntschaedigungSearch;

  @Inject
  @ConversationGroup(AbstractWahlausschussEntschaedigungSearchParameters.class)
  private transient WahlausschussEntschaedigungSearchParameters wahlausschussEntschaedigungSearchParameters;

  @Inject
  private transient WahlausschussEntschaedigungMeta wahlausschussEntschaedigungMeta;

  @Inject
  private transient WahlausschussEntschaedigungEdit wahlausschussEntschaedigungEdit;

  protected AdvancedDynaFormModel model;

  public WahlausschussEntschaedigungBulkEditView() {
    super();
  }

  protected String getViewId() {
    return VIEW_ID;
  }

  protected String getParentViewId() {
    return PARENT_VIEW_ID;
  }

  @Nullable
  @PreConditionCheck
  public String checkPreCondition() {
    if (isGebietSelected()) {
      return null;
    }

    throw new GebietNichtAusgewaehltException();
  }

  private boolean isGebietSelected() {
    return gebietSessionSelect.isSelected();
  }

  public AdvancedDynaFormModel getModel() {
    if (model == null) {
      model = createModel();

    }

    return model;
  }

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

    List<WahlausschussEntschaedigung> entschaedigungen = wahlausschussEntschaedigungSearch.getSearchResult(getWahlausschussEntschaedigungSearchParameters(),
        EagerLoadingCollector.<WahlausschussEntschaedigung> create());
    for (WahlausschussEntschaedigung wahlausschussEntschaedigung : entschaedigungen) {
      formBuilder.addProperty(new MoneyProperty(wahlausschussEntschaedigung.getProperties().getBetragProperty(), wahlausschussEntschaedigung.getWaehrungAlsIsoCode()))
          .withLabel(getMessage(wahlausschussEntschaedigung.getWahlausschussrolle()));

    }
    wahlausschussEntschaedigungConversationStore.setEntities(entschaedigungen);

    return formBuilder.createModel();
  }

  public boolean isBtnSaveRendered() {
    return true;
  }

  @Redirect
  @UseCaseSecure(UseCasePermission.ENTSCHAEDIGUNGSART_EDIT)
  public String save() {
    wahlausschussEntschaedigungEdit.save(wahlausschussEntschaedigungConversationStore.getEntities());

    addInfoMessage("entity.edit.action.save.success.message", wahlausschussEntschaedigungMeta.getMehrzahlMessage());

    wahlausschussEntschaedigungConversationStore.close();

    return getParentViewId();
  }

  public boolean isBtnResetRendered() {
    return true;
  }

  @Redirect
  public String reset() {
    wahlausschussEntschaedigungConversationStore.close();

    model = null;
    wahlausschussEntschaedigungSearchParameters.reset();

    return getParentViewId();
  }

  public boolean isBtnCancelRendered() {
    return false;
  }

  public WahlausschussEntschaedigungSearchParameters getWahlausschussEntschaedigungSearchParameters() {
    wahlausschussEntschaedigungSearchParameters.setWahl(getSelectedWahl());
    return wahlausschussEntschaedigungSearchParameters;
  }

  private Wahl getSelectedWahl() {
    return wahlSessionSelect.getEntity();
  }
}
