
package de.ivu.elect.business.kandidatur.boundary;

import static java.util.Objects.isNull;
import static java.util.Objects.nonNull;

import java.util.List;

import javax.inject.Named;

import org.apache.deltaspike.core.api.scope.ConversationGroup;
import org.apache.deltaspike.core.api.scope.GroupedConversationScoped;

import de.ivu.elect.business.ergebnis.control.AbstractKumulierteStimmenSearchParameters;
import de.ivu.elect.business.ergebnis.entity.Gewaehlt;
import de.ivu.elect.business.ergebnis.entity.GewaehltProperties;
import de.ivu.elect.business.ergebnis.entity.GewaehltStatus;
import de.ivu.elect.business.gruppe.entity.EntityMitGruppe;
import de.ivu.elect.business.gruppe.entity.PolitischeGruppe;
import de.ivu.elect.jee.entity.customdata.EmptyCustomData;
import de.ivu.elect.jee.presentation.dynamicform.AbstractEnumProperty;
import de.ivu.elect.presentation.gruppe.form.GruppeSearchProperty;

@GroupedConversationScoped
@ConversationGroup(KandidaturGewaehltSearchParameters.class)
@Named(KandidaturGewaehltSearchParameters.COMPONENT_NAME)
public class KandidaturGewaehltSearchParameters extends AbstractKumulierteStimmenSearchParameters implements EntityMitGruppe<PolitischeGruppe> {

  private static final long serialVersionUID = 1L;

  public static final String COMPONENT_NAME = "kandidaturGewaehltSearchParameters";

  private Gewaehlt gewaehlt;

  private PolitischeGruppe politischeGruppe;

  private transient GruppeSearchProperty<PolitischeGruppe> politischeGruppeSearchProperty;

  public KandidaturGewaehltSearchParameters() {
    super();
  }

  private Gewaehlt getGewaehlt() {
    if (gewaehlt == null) {
      gewaehlt = new Gewaehlt(EmptyCustomData.INSTANCE);
      gewaehlt.setGewaehltStatus(null);
    }

    return gewaehlt;
  }

  private GewaehltProperties getGewaehltProperties() {
    return getGewaehlt().getProperties();
  }

  public GewaehltStatus getGewaehltStatus() {
    return getGewaehlt().getGewaehltStatus();
  }

  public void setGewaehltStatus(GewaehltStatus gewaehltStatus) {
    getGewaehlt().setGewaehltStatus(getGewaehltStatus());
  }

  public AbstractEnumProperty<GewaehltStatus> getGewaehltStatusMitLeererAuswahlProperty() {
    return getGewaehltProperties().getGewaehltStatusMitLeererAuswahlProperty();
  }

  @Override
  public boolean hasGruppe() {
    return nonNull(getGruppe());
  }

  @Override
  public PolitischeGruppe getGruppe() {
    return politischeGruppe;
  }

  @Override
  public void setGruppe(PolitischeGruppe politischeGruppe) {
    this.politischeGruppe = politischeGruppe;
  }

  public GruppeSearchProperty<PolitischeGruppe> getPolitischeGruppeSearchProperty(List<PolitischeGruppe> gruppen) {
    if (isNull(politischeGruppeSearchProperty)) {
      politischeGruppeSearchProperty = new GruppeSearchProperty<>(this, gruppen, true);
    }

    return politischeGruppeSearchProperty;
  }

  @Override
  public void reset() {
    gewaehlt = null;
    politischeGruppe = null;

    super.reset();
  }
}
