
package de.ivu.elect.presentation.personenpruefung;

import javax.annotation.PostConstruct;
import javax.enterprise.event.Observes;
import javax.enterprise.event.Reception;

import de.ivu.elect.business.gebietsbaum.boundary.GebietNichtAusgewaehltException;
import de.ivu.elect.business.gebietsbaum.boundary.GebietSelectChangeEvent;
import de.ivu.elect.business.personenpruefung.boundary.AbstractPersonenKonfliktByGebietSearchParameters;
import de.ivu.elect.business.wahl.entity.Wahl;
import de.ivu.elect.jee.faces.PreConditionCheck;
import de.ivu.elect.jee.presentation.dynamicform.FormBuilder;

public abstract class AbstractPersonenKonfliktByGebietSearchView<P extends AbstractPersonenKonfliktByGebietSearchParameters> extends AbstractPersonenKonfliktSearchView<P> {

  private static final long serialVersionUID = 1L;

  public AbstractPersonenKonfliktByGebietSearchView() {
    super();
  }

  @Override
  @PreConditionCheck
  public String checkPreCondition() {
    if (isGebietSelected()) {
      return super.checkPreCondition();
    }

    throw new GebietNichtAusgewaehltException();
  }

  @Override
  @PostConstruct
  public void init() {
    super.init();

    // ELECTMUC-550 Auch Gebietswechsel auf anderen Views mitnehmen
    if (hasSearchParameters() && isGebietSelected()) {
      getSearchParameters().setGebiet(getSelectedGebiet());
    }
  }

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

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

  @Override
  public void presetSearchParameters() {
    super.presetSearchParameters();

    AbstractPersonenKonfliktByGebietSearchParameters searchParameters = getSearchParameters();

    if (!searchParameters.hasGebiet()) {
      searchParameters.setGebiet(getSelectedGebiet());
      searchParameters.setIncludeUntergebiete(true);
    }
  }

  @Override
  public abstract AbstractPersonenKonfliktByGebietSearchParameters getSearchParameters();

  @Override
  public void addProperties(FormBuilder formBuilder) {
    formBuilder.addProperty(getSearchParameters().getIncludeUntergebieteProperty());

    super.addProperties(formBuilder);
  }

  public void onGebietSelectChangeEvent(@Observes(notifyObserver = Reception.IF_EXISTS) GebietSelectChangeEvent event) {
    getSearchParameters().setGebiet(getSelectedGebiet());

    resetSearchResult();
  }

  @Override
  public void resetSearchResult() {
    super.resetSearchResult();
  }
}
