
package de.ivu.elect.presentation.gruppe.form;

import java.util.Comparator;
import java.util.List;
import java.util.function.Consumer;
import java.util.function.Supplier;

import de.ivu.elect.business.gruppe.control.GruppeByKurznameComparator;
import de.ivu.elect.business.gruppe.entity.EntityMitGruppe;
import de.ivu.elect.business.gruppe.entity.Gruppe;
import de.ivu.elect.business.gruppe.entity.GruppeConstants;
import de.ivu.elect.presentation.AbstractEntitySelectOneMenuProperty;

public class GruppeSearchProperty<G extends Gruppe> extends AbstractEntitySelectOneMenuProperty<G> {

  private final Supplier<G> getter;

  private final Consumer<G> setter;

  public GruppeSearchProperty(EntityMitGruppe<G> entityMitGruppe, List<G> values, boolean hasNoSelectionItem) {
    this(entityMitGruppe::getGruppe, entityMitGruppe::setGruppe, values, new GruppeByKurznameComparator<>(), hasNoSelectionItem);
  }

  public GruppeSearchProperty(Supplier<G> getter, Consumer<G> setter, List<G> values, Comparator<G> valuesComparator, boolean hasNoSelectionItem) {
    super(values, valuesComparator, hasNoSelectionItem);

    this.getter = getter;
    this.setter = setter;

    if (!hasNoSelectionItem && hasValue() && !values.isEmpty()) {
      setValue(values.iterator().next());
    }
  }

  @Override
  public G getValue() {
    return getter.get();
  }

  @Override
  public void setValue(G value) {
    setter.accept(value);
  }

  @Override
  public String getItemLabel(G item) {
    return formatItemLabel(item);
  }

  public static String formatItemLabel(Gruppe item) {
    return GruppeByKurznameComparator.getKurznameOderName(item);
  }

  @Override
  protected String getMessageKeyEntityEinzahl() {
    return GruppeConstants.MESSAGE_KEY_ENTITY_EINZAHL;
  }
}
