
package de.ivu.elect.presentation.gruppeimgebiet;

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

import de.ivu.elect.business.gebietsbaum.boundary.GebietSelectChangeEvent;
import de.ivu.elect.business.gebietsbaum.entity.Gebiet;
import de.ivu.elect.business.gruppeimgebiet.boundary.GruppeImGebietChangeEvent;
import de.ivu.elect.business.gruppeimgebiet.boundary.GruppeImGebietEdit;
import de.ivu.elect.business.gruppeimgebiet.boundary.GruppeImGebietReihenfolgeBestaetiger;
import de.ivu.elect.business.gruppeimgebiet.boundary.GruppeImGebietSearch;
import de.ivu.elect.business.gruppeimgebiet.boundary.GruppeImGebietSearchParameters;
import de.ivu.elect.business.gruppeimgebiet.boundary.ReihenfolgeBestaetigenOptionFuerGebiet;
import de.ivu.elect.business.gruppeimgebiet.entity.GruppeImGebiet;
import de.ivu.elect.business.gruppeimgebiet.entity.ReihenfolgeBestaetigenOption;
import de.ivu.elect.business.gruppeimgebiet.entity.ReihenfolgeGruppeOption;
import de.ivu.elect.business.gruppeimgebiet.entity.ReihenfolgeZuruecksetzenOption;
import de.ivu.elect.business.security.UseCasePermission;
import de.ivu.elect.business.security.UseCaseSecure;
import de.ivu.elect.jee.entity.EagerLoadingCollector;
import de.ivu.elect.jee.faces.FacesContextUtil;
import de.ivu.elect.jee.presentation.dynamicform.FormBuilder;
import de.ivu.elect.jee.presentation.redirect.Redirect;
import de.ivu.elect.presentation.View;
import de.ivu.elect.presentation.gruppeimgebiet.table.GruppeImGebietColumnBuilder;
import de.ivu.elect.presentation.hilfe.OnlineHilfeId;
import de.ivu.elect.presentation.security.AbstractGebietSecurityFilter;

@OnlineHilfeId("349")
@Named(AbstractGruppeImGebietSearchView.COMPONENT_NAME)
@View(viewId = AbstractGruppeImGebietSearchView.VIEW_ID, useCase = UseCasePermission.GRUPPE_IM_GEBIET_ANZEIGEN)
public class GruppeImGebietSearchView extends AbstractGruppeImGebietSearchView {

  private static final long serialVersionUID = 1L;

  @Inject
  private transient GruppeImGebietSearch gruppeImGebietSearch;

  @Inject
  private transient GruppeImGebietColumnBuilder gruppeImGebietColumnBuilder;

  @Inject
  private transient GruppeImGebietEdit gruppeImGebietEdit;

  @Inject
  private transient GruppeImGebietReihenfolgeBestaetiger gruppeImGebietReihenfolgeBestaetiger;

  @Inject
  private transient GruppeImGebietChangeEvent gruppeImGebietChangeEvent;

  @Inject
  private transient ReihenfolgeBestaetigenOptionFuerGebiet reihenfolgeBestaetigenOptionFuerGebiet;

  private final ReihenfolgeZuruecksetzenOption reihenfolgeZuruecksetzenOption = new ReihenfolgeZuruecksetzenOption();

  private final ReihenfolgeGruppeOption reihenfolgeGruppeOption = new ReihenfolgeGruppeOption();

  private ReihenfolgeBestaetigenOption reihenfolgeBestaetigenOption = null;

  public GruppeImGebietSearchView() {
    super();
  }

  @Override
  public int getDefaultPageSize() {
    return getPageSizeShowAll();
  }

  @Override
  public void presetSearchParameters() {
    searchParameters.setEinzelbewerberAnzeigen(true);
    searchParameters.setStatusOption(getRelevanzDefault());
  }

  protected GruppeImGebietSearchParameters.StatusOption getRelevanzDefault() {
    return GruppeImGebietSearchParameters.StatusOption.ALLE; // ELECT-12831
  }

  @Redirect
  @UseCaseSecure(UseCasePermission.GRUPPE_IM_GEBIET_POSITIONEN_BEARBEITEN)
  public String create() {
    return VIEW_ID;
  }

  @Redirect
  @UseCaseSecure(UseCasePermission.GRUPPE_IM_GEBIET_POSITIONEN_BEARBEITEN)
  public String editReihenfolge() {
    return GruppeImGebietReihenfolgeEditView.VIEW_ID;
  }

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

  public Gebiet getGebietDessenReihenfolgeAngezeigtWird() {
    return gruppeImGebietSearch.bestimmeGebietDessenReihenfolgeAngezeigtWird();
  }

  public boolean isWahlHasErststimmenGebiete() {
    return isWahlSelected() && getSelectedWahl().isWahlMitDirektkandidatengebieten();
  }

  public boolean isHinweisGeerbteReihenfolgeRendered() {
    return isGebietSelected() && !getGebiet().isWahlOderDirektwahlOderListenwahlgebietOderHatEntprechendesUntergebiet();
  }

  public Gebiet getGebiet() {
    return getSelectedGebiet();
  }

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

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

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

  @Redirect
  @UseCaseSecure(UseCasePermission.GRUPPE_IM_GEBIET_POSITIONEN_ZURUECKSETZEN)
  public String reihenfolgeZuruecksetzen() {
    gruppeImGebietEdit.reihenfolgeFuerAusgewaehltesGebietZuruecksetzen(getSelectedGebiet(), reihenfolgeZuruecksetzenOption);
    addInfoMessage("gruppe.im.gebiet.search.reihenfolge.zuruecksetzen.success.message", getSelectedGebiet().getName());
    gruppeImGebietChangeEvent.sendChangeEvent();
    return FacesContextUtil.getCurrentViewId();
  }

  @Redirect
  @UseCaseSecure(UseCasePermission.GRUPPE_IM_GEBIET_POSITIONEN_BEARBEITEN)
  public String reihenfolgeGruppen() {
    gruppeImGebietEdit.reihenfolgeFuerAusgewaehltesGebietGruppen(getSelectedGebiet(), reihenfolgeGruppeOption);
    addInfoMessage("gruppe.im.gebiet.search.reihenfolge.gruppen.success.message", getSelectedGebiet().getName());
    gruppeImGebietChangeEvent.sendChangeEvent();
    return FacesContextUtil.getCurrentViewId();
  }


  @Redirect
  @UseCaseSecure(UseCasePermission.GRUPPE_IM_GEBIET_POSITIONEN_BEARBEITEN)
  public String reihenfolgeBestaetigen() {
    gruppeImGebietReihenfolgeBestaetiger.bestaetigeVorsortierteReihenfolge(getSelectedGebiet(), getReihenfolgeBestaetigenOption());

    addInfoMessage("gruppe.im.gebiet.search.reihenfolge.bestaetigen.success.message", getSelectedGebiet().getName());
    gruppeImGebietChangeEvent.sendChangeEvent();
    return FacesContextUtil.getCurrentViewId();
  }

  public ReihenfolgeZuruecksetzenOption getReihenfolgeZuruecksetzenOption() {
    return reihenfolgeZuruecksetzenOption;
  }

  public ReihenfolgeGruppeOption getReihenfolgeGruppeOption() {
    return reihenfolgeGruppeOption;
  }

  public ReihenfolgeBestaetigenOption getReihenfolgeBestaetigenOption() {
    if (reihenfolgeBestaetigenOption == null) {
      reihenfolgeBestaetigenOption = reihenfolgeBestaetigenOptionFuerGebiet.createDefaultOptionFuerGebiet(getGebiet());
    }
    return reihenfolgeBestaetigenOption;
  }
}
