
package de.ivu.elect.business.benutzerverwaltung.entity;

import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;

import javax.faces.convert.Converter;

import org.apache.commons.lang3.StringUtils;

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


import static org.apache.commons.lang3.StringUtils.isBlank;

public abstract class AbstractRollePickListProperty extends AbstractPickListProperty<Rolle> {

  private static final Comparator<Rolle> DEFAULT_ROLLE_COMPARATOR = new RolleByNameComparator();

  private final RolleMeta rolleMeta;

  private final Collection<Rolle> verfuegbareRollen;

  public AbstractRollePickListProperty(RolleMeta rolleMeta, Collection<Rolle> verfuegbareRollen) {
    super();

    this.verfuegbareRollen = verfuegbareRollen;
    this.rolleMeta = rolleMeta;
  }

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

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

  @Override
  public String getDefaultLabel() {
    return getMetaMehrzahlMessage();
  }

  @Override
  protected List<Rolle> getZugeordneteElemente() {
    List<Rolle> result = new ArrayList<>(getZugeordneteRollen());

    Collections.sort(result, DEFAULT_ROLLE_COMPARATOR);

    return result;
  }

  protected abstract Collection<Rolle> getZugeordneteRollen();

  @Override
  protected void setzeZugeordneteElemente(List<Rolle> rollen) {
    replaceZugeordneteRollen(rollen);
  }

  protected abstract void replaceZugeordneteRollen(Collection<Rolle> zugeordneteRollen);

  @Override
  protected List<Rolle> getVerfuegbareElemente() {
    List<Rolle> result = new ArrayList<>(getVerfuegbareRollen());

    result.removeAll(getZugeordneteRollen());

    Collections.sort(result, DEFAULT_ROLLE_COMPARATOR);

    return result;
  }

  protected Collection<Rolle> getVerfuegbareRollen() {
    return verfuegbareRollen;
  }

  @Override
  public String getSourceCaption() {
    return getMessage(getSourceCaptionMessageKey(), getMetaMehrzahlMessage());
  }

  @Override
  protected String getSourceCaptionMessageKey() {
    return "AbstractRollePickListProperty.source";
  }

  @Override
  public String getTargetCaption() {
    return getMessage(getTargetCaptionMessageKey(), getMetaMehrzahlMessage());
  }

  @Override
  protected String getTargetCaptionMessageKey() {
    return "AbstractRollePickListProperty.target";
  }

  @Override
  public String getItemLabel(Rolle rolle) {
    return formatItemLabel(rolle.getName(), rolle.getBeschreibung());
  }

  protected String formatItemLabel(String name, String beschreibung) {
    if (isBlank(beschreibung) || StringUtils.equals(name, beschreibung)) {
      return name;
    }

    return name + " (" + beschreibung + ")";
  }

  protected String getMetaMehrzahlMessage() {
    return rolleMeta.getMehrzahlMessage();
  }
}
