
package de.ivu.elect.presentation.gruppe;

import java.util.ArrayList;
import java.util.Collections;
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.entity.Gruppe;
import de.ivu.elect.business.gruppe.entity.GruppeArt;
import de.ivu.elect.business.gruppe.entity.GruppeConstants;
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.jee.presentation.dynamicform.LambdaEnumSelectManyProperty;
import de.ivu.elect.jee.presentation.dynamicform.PropertyType;
import de.ivu.elect.presentation.gruppe.table.GruppeColumnBuilder;
import de.ivu.elect.presentation.hilfe.OnlineHilfeId;
import de.ivu.elect.presentation.security.AbstractGebietSecurityFilter;


import static java.util.Arrays.asList;

@OnlineHilfeId("233")
@Named(AbstractGruppeSearchView.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 void presetSearchParameters() {
    searchParameters.setWahl(getSelectedWahl());
    searchParameters.setGruppeArten(asList(GruppeArt.PARTEI, GruppeArt.WAEHLERGRUPPE, GruppeArt.WAEHLERGRUPPE_NICHT_ORGANISIERT, GruppeArt.VEREINIGUNG));

    if (isWahlSelected() && getSelectedWahl().isWahlMitReferendengebieten()) { // ELECT-2584 NullPointerException, wenn noch keine Wahl ausgewählt
      searchParameters.setGruppeArten(Collections.singleton(GruppeArt.REFERENDUM_VORLAGE));
    }

  }

  @Override
  public void addProperties(FormBuilder formBuilder) {

    formBuilder.addProperty(
        new LambdaEnumSelectManyProperty<>(PropertyType.SELECT_MANY_CHECKBOX_MENU, getMessage(GruppeConstants.MESSAGE_KEY_GRUPPE_ART_MEHRZAHL), false,
            getSearchParameters()::setGruppeArten,
            getSearchParameters()::getGruppeArten,
            GruppeArt.class, asList(GruppeArt.values())));

    formBuilder.addProperty(getSearchParameters().getGruppe().getProperties().getSchluesselProperty()).withRequired(false);
    formBuilder.addProperty(getSearchParameters().getGruppe().getProperties().getNameProperty()).withRequired(false);
    formBuilder.addProperty(getSearchParameters().getGruppe().getProperties().getKurznameProperty()).withRequired(false);

  }

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

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

    gruppeColumnBuilder.collectEagerLoadings(eagerLoadingCollector);

    return eagerLoadingCollector;
  }
}
