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

import static java.util.Objects.nonNull;
import static org.apache.commons.lang3.StringUtils.defaultString;
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.business.staat.control.StaatByNameStaatsangehoerigkeitInlandZuerstComparator;
import de.ivu.elect.jee.faces.EntityConverter;
import de.ivu.elect.jee.presentation.dynamicform.AbstractPickListProperty;

public class StaatenGruppeStaatenPickListProperty extends AbstractPickListProperty<Staat> {

  private static final Comparator<Staat> DEFAULT_COMPARATOR = new StaatByNameStaatsangehoerigkeitInlandZuerstComparator();

  private final StaatenGruppe staatenGruppe;

  private final List<Staat> staatenVerfuegbar;

  public StaatenGruppeStaatenPickListProperty(StaatenGruppe staatenGruppe, List<Staat> staatenVerfuegbar) {
    super();

    this.staatenGruppe = staatenGruppe;
    this.staatenVerfuegbar = staatenVerfuegbar;
  }

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

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

  @Override
  protected List<Staat> getZugeordneteElemente() {
    return asSortedList(staatenGruppe.getStaats());
  }

  @Override
  protected void setzeZugeordneteElemente(List<Staat> staaten) {
    staatenGruppe.removeAllStaats();

    for (Staat staat : staaten) {
      staatenGruppe.addStaat(staat);
    }
  }

  @Override
  protected List<Staat> getVerfuegbareElemente() {
    List<Staat> result = asSortedList(staatenVerfuegbar);

    result.removeAll(getZugeordneteElemente());

    return result;
  }

  private List<Staat> asSortedList(Collection<Staat> staaten) {
    List<Staat> result = new ArrayList<>(staaten);

    Collections.sort(result, DEFAULT_COMPARATOR);

    return result;
  }

  @Override
  public String getItemFilterLabel(Staat staat) {
    String displayCode = "";

    if (nonNull(staat)) {
      displayCode = defaultString(staat.getCustomCodeStaat(), staat.getCustomCodeStaatsangehoerigkeit());
    }

    // ELECTMUC-1074
    return trimToEmpty(displayCode) + " " + getItemLabel(staat);
  }

  @Override
  public String getItemLabel(Staat staat) {
    String displayName = "";

    if (nonNull(staat)) {
      displayName = defaultString(staat.getNameStaat(), staat.getNameStaatsangehoerigkeit());
    }

    return trimToEmpty(displayName);
  }

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

  @Override
  protected String getSourceCaptionMessageKey() {
    return "staaten.gruppe.edit.staaten.source";
  }

  @Override
  protected String getTargetCaptionMessageKey() {
    return "staaten.gruppe.edit.staaten.target";
  }
}
