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

import static java.util.Objects.nonNull;
import static org.apache.commons.lang3.StringUtils.trimToEmpty;

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 de.ivu.elect.jee.faces.EntityConverter;
import de.ivu.elect.jee.presentation.dynamicform.AbstractPickListProperty;
import de.ivu.elect.presentation.gebietsbaum.GebietNummerFormatter;

public class GebietsgruppierungGebietPickListProperty extends AbstractPickListProperty<Gebiet> {

  private static final Comparator<Gebiet> DEFAULT_COMPARATOR = Gebiet.GEBIET_BY_GEBIETSART_AND_POSITION_COMPARATOR;

  private final Gebietsgruppierung gebietsgruppierung;
  private final List<Gebiet> gebieteVerfuegbar;
  private final GebietNummerFormatter gebietNummerFormatter;

  public GebietsgruppierungGebietPickListProperty(Gebietsgruppierung gebietsgruppierung, List<Gebiet> gebieteVerfuegbar, GebietNummerFormatter gebietNummerFormatter) {
    super();

    this.gebietsgruppierung = gebietsgruppierung;
    this.gebieteVerfuegbar = gebieteVerfuegbar;
    this.gebietNummerFormatter = gebietNummerFormatter;
  }

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

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

  @Override
  protected List<Gebiet> getZugeordneteElemente() {
    return asSortedList(gebietsgruppierung.getGebiete());
  }

  @Override
  protected void setzeZugeordneteElemente(List<Gebiet> gebiete) {
    gebietsgruppierung.removeAllGebiets();

    for (Gebiet gebiet : gebiete) {
      gebietsgruppierung.addGebiet(gebiet);
    }
  }

  @Override
  protected List<Gebiet> getVerfuegbareElemente() {
    List<Gebiet> result = asSortedList(gebieteVerfuegbar);
    result.removeAll(getZugeordneteElemente());

    return result;
  }

  protected List<Gebiet> asSortedList(Collection<Gebiet> gebiete) {
    List<Gebiet> result = new ArrayList<>(gebiete);
    Collections.sort(result, DEFAULT_COMPARATOR);

    return result;
  }

  @Override
  public String getItemLabel(Gebiet gebiet) {
    return trimToEmpty(gebietNummerFormatter.getNameMitNummer(gebiet));
  }

  @Override
  public String getItemTooltip(Gebiet gebiet) {
    if (nonNull(gebiet) && nonNull(gebiet.getGebietsart())) {
      return trimToEmpty(gebiet.getGebietsart().getName());
    }

    return super.getItemTooltip(gebiet);
  }

  @Override
  public String getDefaultLabel() {
    return getMessage(GebietConstants.MESSAGE_KEY_ENTITY_MEHRZAHL);
  }

  @Override
  protected String getSourceCaptionMessageKey() {
    return "gebietsgruppierung.edit.gebiete.source";
  }

  @Override
  protected String getTargetCaptionMessageKey() {
    return "gebietsgruppierung.edit.gebiete.target";
  }

  protected Gebietsgruppierung getGebietsgruppierung() {
    return gebietsgruppierung;
  }
}
