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.jee.entity.EagerLoadingCollector;
import de.ivu.elect.presentation.hilfe.OnlineHilfeId;
import de.ivu.elect.presentation.wahlbeteiligung.table.WahlbeteiligungColumnBuilder;
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.WahlbeteiligungAuswertungConversationSelect;
import de.ivu.elect.business.wahlbeteiligung.boundary.WahlbeteiligungSearchParameters;
import de.ivu.elect.business.wahlbeteiligung.entity.Wahlbeteiligung;
import de.ivu.elect.business.wahlbeteiligung.entity.WahlbeteiligungAuswertung;
import de.ivu.elect.jee.faces.PreConditionCheck;
import de.ivu.elect.jee.presentation.dynamicform.FormBuilder;
import de.ivu.elect.presentation.View;
import de.ivu.elect.presentation.security.AbstractGebietSecurityFilter;

@ViewAccessScoped
@Named(AbstractWahlbeteiligungSearchView.COMPONENT_NAME)
@View(viewId = AbstractWahlbeteiligungSearchView.VIEW_ID, useCase = UseCasePermission.WAHLBETEILIGUNG_SEARCH)
@OnlineHilfeId(value = "765", mehrfachVergebenOk = true)
public class WahlbeteiligungSearchView extends AbstractWahlbeteiligungSearchView {

  private static final long serialVersionUID = 1L;

  @Inject
  private transient WahlbeteiligungAuswertungConversationSelect wahlbeteiligungAuswertungConversationSelect;

  @Inject
  private transient WahlbeteiligungColumnBuilder wahlbeteiligungColumnBuilder;

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

    return null;
  }

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

  @Override
  public void presetSearchParameters() {
    WahlbeteiligungAuswertung entity = wahlbeteiligungAuswertungConversationSelect.getEntity();
    if (entity == null) {
      getSearchParameters().getWahlbeteiligungAuswertung().setDatum(null);
    } else {
      getSearchParameters().getWahlbeteiligungAuswertung().setDatum(entity.getDatum());
    }
  }

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

  @Override
  public void addProperties(FormBuilder formBuilder) {
//    formBuilder.addProperty(new LambdaBooleanProperty(getMessage("wahlbeteiligung.search.untergeordnete.gebiete.anzeigen"), false,
//        getSearchParameters()::setUntergeordneteGebieteAnzeigen, getSearchParameters()::isUntergeordneteGebieteAnzeigen));
    formBuilder.addProperty(getSearchParameters().getWahlbeteiligungAuswertung().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().getWahlbeteiligung();
    reset();
  }

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

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

  @Override
  public EagerLoadingCollector<Wahlbeteiligung> getEagerLoadingCollector() {
    EagerLoadingCollector<Wahlbeteiligung> eagerLoadingCollector = super.getEagerLoadingCollector();
    wahlbeteiligungColumnBuilder.collectEagerLoadings(eagerLoadingCollector);
    return eagerLoadingCollector;
  }
}
