package de.ivu.elect.presentation;

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

import javax.faces.convert.Converter;

import de.ivu.elect.jee.entity.Entity;
import de.ivu.elect.jee.faces.EntityConverter;
import de.ivu.elect.jee.presentation.dynamicform.AbstractPickListProperty;

public abstract class AbstractEntityPickListProperty<E extends Entity<?, ?>> extends AbstractPickListProperty<E> {

  private final List<E> verfuegbareEntititaeten;

  private final Function<E, String> labeler;

  private final String msgKeyLabel;

  private final String msgKeyVerfuegbar;

  private final String msgKeyZugeordnet;

  private final boolean required;

  private List<E> zugeordneteEntititaeten;

  public AbstractEntityPickListProperty(List<E> verfuegbareGebietsarten, List<E> zugeordneteGebietsarten, Function<E, String> labeler, String msgKeyLabel, String msgKeyVerfuegbar, String msgKeyZugeordnet, boolean required) {
    super();
    this.verfuegbareEntititaeten = verfuegbareGebietsarten;
    this.zugeordneteEntititaeten = zugeordneteGebietsarten;
    this.labeler = labeler;
    this.msgKeyLabel = msgKeyLabel;
    this.msgKeyVerfuegbar = msgKeyVerfuegbar;
    this.msgKeyZugeordnet = msgKeyZugeordnet;
    this.required = required;
  }

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

  @Override
  public List<E> getZugeordneteElemente() {
    return zugeordneteEntititaeten;
  }

  @Override
  protected List<E> getVerfuegbareElemente() {
    return verfuegbareEntititaeten;
  }

  @Override
  protected void setzeZugeordneteElemente(List<E> list) {
    this.zugeordneteEntititaeten = list;
  }

  @Override
  protected String getSourceCaptionMessageKey() {
    return msgKeyVerfuegbar;
  }

  @Override
  protected String getTargetCaptionMessageKey() {
    return msgKeyZugeordnet;
  }

  @Override
  public String getItemLabel(E entity) {
    return labeler.apply(entity);
  }

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

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

}
