
package de.ivu.elect.presentation.kandidatur;

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

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

import de.ivu.elect.business.gebietsbaum.boundary.GebietSelectChangeEvent;
import de.ivu.elect.business.gruppe.boundary.PolitischeGruppeExtendedDAO;
import de.ivu.elect.business.kandidatur.boundary.KandidaturSearchParameters;
import de.ivu.elect.business.kandidatur.entity.Kandidatur;
import de.ivu.elect.business.security.UseCasePermission;
import de.ivu.elect.business.wahl.entity.Wahl;
import de.ivu.elect.jee.entity.EagerLoadingCollector;
import de.ivu.elect.jee.faces.PreConditionCheck;
import de.ivu.elect.jee.presentation.dynamicform.FormBuilder;
import de.ivu.elect.jee.presentation.search.AbstractSearchParameters;
import de.ivu.elect.presentation.View;
import de.ivu.elect.presentation.hilfe.OnlineHilfeId;
import de.ivu.elect.presentation.kandidatur.table.KandidaturColumnBuilder;
import de.ivu.elect.presentation.security.AbstractGebietSecurityFilter;
import de.ivu.elect.presentation.veranstaltung.TeilnehmerEinladenView;
import de.ivu.elect.presentation.wahl.CurrentWahlZulassungspruefungExtended;

@ViewAccessScoped
@OnlineHilfeId("240")
@Named(AbstractKandidaturSearchView.COMPONENT_NAME)
@View(viewId = AbstractKandidaturSearchView.VIEW_ID, useCase = UseCasePermission.KANDIDATUR_SEARCH)
public class KandidaturSearchView extends AbstractKandidaturSearchView implements TeilnehmerEinladenView {

  private static final long serialVersionUID = 1L;

  @Inject
  protected transient PolitischeGruppeExtendedDAO politischeGruppeDao;

  @Inject
  private transient KandidaturColumnBuilder kandidaturColumnBuilder;

  @Inject
  private transient CurrentWahlZulassungspruefungExtended currentWahlZulassungspruefung;

  public KandidaturSearchView() {
    super();
  }

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

    return getStartViewId();
  }

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

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

  public void onGebietSelectChangeEvent(@Observes(notifyObserver = Reception.IF_EXISTS) GebietSelectChangeEvent event) {
    resetSearchResult();
  }

  protected Wahl getWahl() {
    return getSelectedGebiet().getWahl();
  }

  @Override
  public KandidaturSearchParameters getSearchParameters() {
    KandidaturSearchParameters searchParametersLokal = super.getSearchParameters();
    searchParametersLokal.setGebiet(getSelectedGebiet());

    return searchParametersLokal;
  }

  @Override
  public void presetSearchParameters() {
    resetSearchParameters();
    resetSearchParametersModel();
  }

  private void resetSearchParameters() {
    getSearchParameters(); // initialisiere Gebiet
  }

  @Override
  public boolean isBtnTeilnehmerEinladenRendered() {
    // Weitere Bedingungen in EL hinterlegt, cf. kandidatur-search.xhtml!!!
    return true;
  }

  @Override
  public boolean isBtnTeilnehmerEinladenDisabled() {
    return isEmptySearchResultDisplayed();
  }

  @Override
  public void addProperties(FormBuilder formBuilder) {
    String wildcardTooltip = getMessage(AbstractSearchParameters.WILDCARD_TOOLTIP_MSG_KEY);

    formBuilder.addProperty(getSearchParameters().getPolitischeGruppeProperty(politischeGruppeDao.findByWahlOrderByKurzname(getWahl())));

    if (currentWahlZulassungspruefung.isZulassungBearbeitbar()) { // ELECT-7446
      formBuilder.addProperty(getSearchParameters().getKandidaturStatusProperty());
      formBuilder.addProperty(getSearchParameters().getPersonStatusProperty());
    }

    formBuilder.addProperty(getSearchParameters().getFamiliennameProperty()).withTooltip(wildcardTooltip);
    formBuilder.addProperty(getSearchParameters().getVornameProperty()).withTooltip(wildcardTooltip);
  }

  @Override
  public EagerLoadingCollector getEagerLoadingCollector() {
    EagerLoadingCollector eagerLoadingCollector = super.getEagerLoadingCollector();
    kandidaturColumnBuilder.collectEagerLoadings(eagerLoadingCollector);

    return eagerLoadingCollector;
  }

  public String getPageTitle() {
    return getMessage("kandidatur.search.page.title");
  }

  public String getPageHeader() {
    return getMessage("kandidatur.search.page.header", getGebietName());
  }
}
