
package de.ivu.elect.presentation.gruppe;

import java.util.ArrayList;
import java.util.List;

import javax.annotation.Nullable;
import javax.enterprise.inject.Instance;
import javax.inject.Inject;
import javax.inject.Named;

import de.ivu.elect.business.gruppe.boundary.GruppeSearchParameters;
import de.ivu.elect.business.gruppe.entity.Gruppe;
import de.ivu.elect.business.wahl.boundary.WahlNichtAusgewaehltException;
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.presentation.gruppe.table.GruppeColumnBuilder;
import de.ivu.elect.presentation.hilfe.OnlineHilfeId;
import de.ivu.elect.presentation.security.AbstractGebietSecurityFilter;

@OnlineHilfeId("233")
@Named(GruppeSearchView.COMPONENT_NAME)
public class GruppeSearchView extends AbstractGruppeSearchView {

  private static final long serialVersionUID = 1L;

  @Inject
  private transient GruppeColumnBuilder gruppeColumnBuilder;

  @Inject
  private transient Instance<GruppeSearchCreateEditEnabled> gruppeSearchEnabled;

  public GruppeSearchView() {
    super();
  }

  @Nullable
  @PreConditionCheck
  public String checkCondition() {
    if (isWahlSelected()) {
      return null;
    }
    for (GruppeSearchCreateEditEnabled searchEnabled : gruppeSearchEnabled) {
      if (searchEnabled.isEnabled()) {
        return null;
      }
    }

    throw new WahlNichtAusgewaehltException();
  }

  @Override
  protected AbstractGebietSecurityFilter<Gruppe> getGebietSecurityFilter() {
    return KEIN_GEBIET_SECURITY_FILTER;
  }

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

  public String getPageHeader() {
    return getMessage("gruppe.search.page.header");
  }

  @Override
  public boolean isSearchParametersRendered() {
    return true; // (noch) im View direkt hinterlegt
  }

  @Override
  public void presetSearchParameters() {
    searchParameters.setWahl(getSelectedWahl());
    searchParameters.setGruppeArtOption(GruppeSearchParameters.GruppeArtOption.PARTEI_WAEHLERGRUPPE_VEREINIGUNG);

    if (isWahlSelected() && getSelectedWahl().isWahlMitReferendengebieten()) { // ELECT-2584 NullPointerException, wenn noch keine Wahl ausgewählt
      searchParameters.setGruppeArtOption(GruppeSearchParameters.GruppeArtOption.REFERENDUM_VORLAGE);
    }

  }

  @Override
  public void addProperties(FormBuilder formBuilder) {
    // nichts zu tun
  }

  public List<String> getDialogTemplates() {
    return new ArrayList<>(); // ELECT-10160
  }

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

    gruppeColumnBuilder.collectEagerLoadings(eagerLoadingCollector);

    return eagerLoadingCollector;
  }
}
