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

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

import javax.annotation.Nullable;
import javax.faces.convert.Converter;

import de.ivu.elect.business.gruppe.control.GruppeByKurznameComparator;
import de.ivu.elect.business.gruppe.entity.EntityMitGruppen;
import de.ivu.elect.business.gruppe.entity.Gruppe;
import de.ivu.elect.business.gruppe.entity.GruppeConstants;
import de.ivu.elect.jee.faces.EntityConverter;
import de.ivu.elect.jee.presentation.dynamicform.AbstractPickListProperty;

public class GruppenSearchProperty<G extends Gruppe> extends AbstractPickListProperty<G> {

  private final Supplier<List<G>> getter;

  private final Consumer<List<G>> setter;

  private final List<G> values;

  public GruppenSearchProperty(EntityMitGruppen<G> entityMitGruppen, List<G> values) {
    this(entityMitGruppen::getGruppen, entityMitGruppen::setGruppen, values, new GruppeByKurznameComparator<>());
  }

  public GruppenSearchProperty(Supplier<List<G>> getter, Consumer<List<G>> setter, List<G> values, Comparator<Gruppe> valuesComparator) {
    super();

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

    this.values = new ArrayList<>(values);
    this.values.sort(valuesComparator);
  }

  @Override
  protected List<G> getZugeordneteElemente() {
    return getter.get();
  }

  @Override
  protected void setzeZugeordneteElemente(List<G> value) {
    setter.accept(value);
  }

  @Override
  protected List<G> getVerfuegbareElemente() {
    return values;
  }

  @Override
  protected String getSourceCaptionMessageKey() {
    return "gruppe.nach.gebiet.gruppen.verfuegbar";
  }

  @Override
  protected String getTargetCaptionMessageKey() {
    return "gruppe.nach.gebiet.gruppen.ausgewaehlt";
  }

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

  @Override
  public String getDefaultLabel() {
    return getMessage(getMessageKeyEntityMehrzahl());
  }

  protected String getMessageKeyEntityMehrzahl() {
    return GruppeConstants.MESSAGE_KEY_ENTITY_MEHRZAHL;
  }

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

  @Override
  public Converter getDefaultConverter() {
    return EntityConverter.getInstance();
  }

  @Override
  public boolean isShowTargetControls() {
    return true;
  }

  @Override
  public boolean isColorPresent() {
    return true;
  }

  @Nullable
  @Override
  public String getItemColor(G item) {
    if (item == null) {
      return null;
    }

    return item.getFarbe();
  }
}
