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

import java.util.List;
import java.util.function.Function;

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.boundary.KumulierteStimmenSearchStimmabgabeartProperty;
import de.ivu.elect.business.ergebnis.boundary.NachErfassungsgebietStimmenSearchGebietsauswahlProperty;
import de.ivu.elect.business.ergebnis.control.AbstractNachErfassungsgebietStimmenSearchParameters;
import de.ivu.elect.business.ergebnis.entity.Stimmabgabeart;
import de.ivu.elect.business.gruppe.entity.EntityMitGruppe;
import de.ivu.elect.business.gruppe.entity.Gruppe;
import de.ivu.elect.business.gruppe.entity.PolitischeGruppe;
import de.ivu.elect.business.kandidatur.entity.Kandidatur;
import de.ivu.elect.business.kandidatur.entity.KandidaturConstants;
import de.ivu.elect.jee.presentation.dynamicform.Property;
import de.ivu.elect.presentation.gruppe.form.GruppeSearchProperty;
import de.ivu.elect.presentation.kandidatur.form.KandidaturSearchProperty;


import static java.util.Arrays.asList;
import static java.util.Objects.isNull;

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

  private static final long serialVersionUID = 1L;

  public static final String COMPONENT_NAME = "kandidaturNachErfassungsgebietStimmenSearchParameters";

  private transient Property gebietsauswahlProperty;

  private transient Property stimmabgabeartProperty;

  private PolitischeGruppe politischeGruppe;

  private transient GruppeSearchProperty<PolitischeGruppe> politischeGruppeSearchProperty;

  private Kandidatur kandidatur;

  private KandidaturSearchProperty kandidaturSearchProperty;

  public KandidaturNachErfassungsgebietStimmenSearchParameters() {
    super();
  }

  public Property getGebietsauswahlProperty() {
    if (gebietsauswahlProperty == null) {
      gebietsauswahlProperty = new NachErfassungsgebietStimmenSearchGebietsauswahlProperty(this);
    }

    return gebietsauswahlProperty;
  }

  public Property getStimmabgabeartProperty() {
    if (stimmabgabeartProperty == null) {
      stimmabgabeartProperty = new KumulierteStimmenSearchStimmabgabeartProperty(this, asList(Stimmabgabeart.GESAMT, Stimmabgabeart.AUSGEZAEHLT));
    }

    return stimmabgabeartProperty;
  }

  @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, false);
    }

    return politischeGruppeSearchProperty;
  }

  public Kandidatur getKandidatur() {
    return kandidatur;
  }

  public void setKandidatur(Kandidatur kandidatur) {
    this.kandidatur = kandidatur;
  }

  public KandidaturSearchProperty getKandidaturSearchProperty(GruppeSearchProperty<PolitischeGruppe> politischeGruppeSearchProperty, Function<Gruppe, List<Kandidatur>> kandidaturenByGruppeFinder, Function<Kandidatur, String> labeler) {
    if (isNull(kandidaturSearchProperty)) {
      kandidaturSearchProperty = new KandidaturSearchProperty(politischeGruppeSearchProperty, kandidaturenByGruppeFinder, this::setKandidatur,
          this::getKandidatur, labeler, KandidaturConstants.MESSAGE_KEY_ENTITY_EINZAHL, false, true);
    }
    return kandidaturSearchProperty;
  }

  @Override
  public void reset() {
    super.reset();
    politischeGruppe = null;
    kandidatur = null;
  }
}
