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

import java.util.ArrayList;
import java.util.List;

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

import de.ivu.elect.business.ergebnis.entity.Ergebnis;
import de.ivu.elect.business.ergebnis.entity.StimmenConstants;
import de.ivu.elect.business.ergebnis.entity.Stimmenart;
import de.ivu.elect.business.gebietsbaum.entity.Wahldurchfuehrungsgebiet;
import de.ivu.elect.business.gruppe.entity.EntityMitGruppen;
import de.ivu.elect.business.gruppe.entity.Gruppe;
import de.ivu.elect.business.search.control.AbstractElectSearchParameters;
import de.ivu.elect.jee.presentation.dynamicform.AbstractEnumProperty;
import de.ivu.elect.jee.presentation.dynamicform.Property;
import de.ivu.elect.presentation.gruppe.form.GruppenSearchProperty;


import static java.util.Arrays.asList;

@GroupedConversationScoped
@ConversationGroup(StimmeingabeHochgerechnetSearchParameters.class)
public class StimmeingabeHochgerechnetSearchParameters extends AbstractElectSearchParameters implements EntityMitGruppen<Gruppe> {

  private static final long serialVersionUID = 1L;

  Wahldurchfuehrungsgebiet wahldurchfuehrungsgebiet;

  Ergebnis ergebnis;

  List<Gruppe> gruppen = new ArrayList<>();

  Stimmenart stimmenart;

  private transient GruppenSearchProperty<Gruppe> gruppenSearchProperty;

  private transient Property stimmenartProperty;

  StimmeingabeAuffaelligkeitSearchParameters stimmeingabeAuffaelligkeitSearchParameters;

  @Override
  public List<Gruppe> getGruppen() {
    if (gruppen == null) {
      gruppen = new ArrayList<>();
    }
    return gruppen;
  }

  @Override
  public void setGruppen(List<Gruppe> gruppen) {
    this.gruppen = gruppen;
  }

  public Stimmenart getStimmenart() {
    return stimmenart;
  }

  public void setStimmenart(Stimmenart stimmenart) {
    this.stimmenart = stimmenart;
  }

  public Ergebnis getErgebnis() {
    return ergebnis;
  }

  public void setErgebnis(Ergebnis ergebnis) {
    this.ergebnis = ergebnis;
  }

  public Wahldurchfuehrungsgebiet getWahldurchfuehrungsgebiet() {
    return wahldurchfuehrungsgebiet;
  }

  public void setWahldurchfuehrungsgebiet(Wahldurchfuehrungsgebiet wahldurchfuehrungsgebiet) {
    this.wahldurchfuehrungsgebiet = wahldurchfuehrungsgebiet;
  }

  public void setStimmeingabeAuffaelligkeitSearchParameters(StimmeingabeAuffaelligkeitSearchParameters auffaelligkeitSearchParameters) {
    stimmeingabeAuffaelligkeitSearchParameters = auffaelligkeitSearchParameters;
  }

  public StimmeingabeAuffaelligkeitSearchParameters getStimmeingabeAuffaelligkeitSearchParameters() {
    return stimmeingabeAuffaelligkeitSearchParameters;
  }

  public Property getStimmenartProperty() {
    if (stimmenartProperty == null) {
      stimmenartProperty = new AbstractEnumProperty<Stimmenart>() {

        @Override
        public List<Stimmenart> getValues() {
          return asList(Stimmenart.DIREKTSTIMME, Stimmenart.LISTENSTIMME, Stimmenart.GESAMT);
        }

        @Override
        public Stimmenart getValue() {
          return StimmeingabeHochgerechnetSearchParameters.this.getStimmenart();
        }

        @Override
        public void setValue(Stimmenart stimmenart) {
          StimmeingabeHochgerechnetSearchParameters.this.setStimmenart(stimmenart);
        }

        @Override
        public String getDefaultLabel() {
          return getMessage(StimmenConstants.MESSAGE_KEY_STIMMENART_EINZAHL);
        }

        @Override
        public boolean getDefaultRequired() {
          return false;
        }

        @Override
        protected Class<Stimmenart> getEnumClass() {
          return Stimmenart.class;
        }

        @Override
        public boolean hasNoSelectionItem() {
          return true;
        }
      };
    }
    return stimmenartProperty;

  }

  public GruppenSearchProperty<Gruppe> getGruppenSearchProperty(List<Gruppe> gruppen) {
    if (gruppenSearchProperty == null) {
      gruppenSearchProperty = new GruppenSearchProperty<>(this, gruppen);
    }

    return gruppenSearchProperty;
  }
}
