
package de.ivu.elect.presentation.wahlbeteiligung;

import javax.annotation.Nullable;
import javax.enterprise.event.Observes;
import javax.enterprise.event.Reception;
import javax.inject.Inject;
import javax.inject.Named;

import de.ivu.elect.presentation.hilfe.OnlineHilfeId;
import org.apache.deltaspike.core.api.scope.ViewAccessScoped;

import de.ivu.elect.business.gebietsbaum.boundary.GebietSelectChangeEvent;
import de.ivu.elect.business.security.UseCasePermission;
import de.ivu.elect.business.wahl.boundary.WahlSelectChangeEvent;
import de.ivu.elect.business.wahlbeteiligung.boundary.WahlbeteiligungVerlaufConversationSelect;
import de.ivu.elect.business.wahlbeteiligung.boundary.WahlbeteiligungVerlaufExtendedDAO;
import de.ivu.elect.business.wahlbeteiligung.boundary.WahlbeteiligungVerlaufGebietSearchParameters;
import de.ivu.elect.business.wahlbeteiligung.entity.WahlbeteiligungVerlauf;
import de.ivu.elect.business.wahlbeteiligung.entity.WahlbeteiligungVerlaufGebiet;
import de.ivu.elect.jee.faces.PreConditionCheck;
import de.ivu.elect.jee.presentation.dynamicform.FormBuilder;
import de.ivu.elect.jee.presentation.dynamicform.LambdaBooleanProperty;
import de.ivu.elect.presentation.View;
import de.ivu.elect.presentation.security.AbstractGebietSecurityFilter;

@ViewAccessScoped
@Named(AbstractWahlbeteiligungVerlaufGebietSearchView.COMPONENT_NAME)
@View(viewId = AbstractWahlbeteiligungVerlaufGebietSearchView.VIEW_ID, useCase = UseCasePermission.WAHLBETEILIGUNG_VERLAUF_GEBIET_SEARCH)
@OnlineHilfeId(value = "766", mehrfachVergebenOk = true)
public class WahlbeteiligungVerlaufGebietSearchView extends AbstractWahlbeteiligungVerlaufGebietSearchView {

  private static final long serialVersionUID = 1L;

  public WahlbeteiligungVerlaufGebietSearchView() {
    super();
  }

  @Inject
  private transient WahlbeteiligungVerlaufConversationSelect wahlbeteiligungVerlaufConversationSelect;

  @Inject
  private transient WahlbeteiligungVerlaufExtendedDAO wahlbeteiligungVerlaufExtendedDAO;

  @Nullable
  @PreConditionCheck
  public String checkCondition() {
    if (!isWahlSelected()) {
      return getStartViewId();
    }

    return null;
  }

  @Override
  protected AbstractGebietSecurityFilter<WahlbeteiligungVerlaufGebiet> getGebietSecurityFilter() {
    return AbstractGebietSecurityFilter.createEntityMitGebietSecurityFilter(getEinsehenGebietSecurity());
  }

  @Override
  public void presetSearchParameters() {
    WahlbeteiligungVerlauf entity = wahlbeteiligungVerlaufConversationSelect.getEntity();
    if (entity==null) {
      getSearchParameters().getWahlbeteiligungVerlauf().setName(null);
      getSearchParameters().getWahlbeteiligungVerlauf().setDatum(null);
    } else {
      getSearchParameters().getWahlbeteiligungVerlauf().setName(entity.getName());
      getSearchParameters().getWahlbeteiligungVerlauf().setDatum(entity.getDatum());
    }
  }

  @Override
  public WahlbeteiligungVerlaufGebietSearchParameters getSearchParameters() {
    WahlbeteiligungVerlaufGebietSearchParameters searchParameters = super.getSearchParameters();
    searchParameters.setGebiet(getSelectedGebiet());
    searchParameters.setWahl(getSelectedWahl());
    return searchParameters;
  }

  @Override
  public void addProperties(FormBuilder formBuilder) {
    formBuilder.addProperty(new LambdaBooleanProperty(getMessage("wahlbeteiligung.verlauf.gebiet.search.untergeordnete.gebiete.anzeigen"), false,
        getSearchParameters()::setUntergeordneteGebieteAnzeigen, getSearchParameters()::isUntergeordneteGebieteAnzeigen));
    formBuilder.addProperty(getSearchParameters().getWahlbeteiligungVerlauf().getProperties().getNameProperty()).withRequired(false);
    formBuilder.addProperty(getSearchParameters().getWahlbeteiligungVerlauf().getProperties().getDatumProperty()).withRequired(false);
  }

  public String getGebietName() {
    return getSelectedGebietNameFormatted();
  }

  @Override
  public void onWahlSelectChangeEvent(@Observes(notifyObserver = Reception.IF_EXISTS) WahlSelectChangeEvent event) {
    reset();
  }

  // NOTE ELECTMUC-882, dass Suchparameter ggf. (!) vom ausgewählten Gebiet abhängig sind. Wird dieses gewechselt müssen
  // NICHT alle Werte des Suchparameter, zumindest aber die Pagination, zurückgesetzt werden!
  public void onGebietSelectChangeEvent(@Observes(notifyObserver = Reception.IF_EXISTS) GebietSelectChangeEvent event) {
    getSearchParameters().getWahlbeteiligungVerlaufGebiet();
    reset();
  }

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

  @Override
  public String goBack(String fallBackViewId) {
    return super.goBack(WahlbeteiligungVerlaufSearchView.VIEW_ID);
  }
}
