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

import static java.util.stream.Collectors.toMap;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.faces.convert.Converter;

import de.ivu.elect.business.gebietsbaum.entity.Gebiet;
import de.ivu.elect.business.wahlvorschlag.entity.Liste;
import de.ivu.elect.business.wahlvorschlag.entity.ListeConstants;
import de.ivu.elect.business.wahlvorschlag.entity.Listenverbindung;
import de.ivu.elect.jee.faces.EntityConverter;
import de.ivu.elect.jee.presentation.dynamicform.AbstractPickListProperty;

public class ListenverbindungListePickListProperty extends AbstractPickListProperty<Liste> {

  private final Listenverbindung listenverbindung;

  private final List<Liste> listenVerfuegbar;

  private final Map<Liste, String> itemLabelPerListeVerfuegbar;

  private final Comparator<Liste> itemComparator;

  public ListenverbindungListePickListProperty(Listenverbindung listenverbindung, Gebiet gebiet, List<Liste> listenVerfuegbar, Comparator<Liste> itemComparator) {
    super();

    this.listenverbindung = listenverbindung;

    this.listenVerfuegbar = listenVerfuegbar;

    this.itemLabelPerListeVerfuegbar = new HashMap<>();
    this.itemLabelPerListeVerfuegbar.putAll(listenverbindung.getListen().stream().collect(toMap(liste -> liste, Liste::getKurznameAufGebiet)));
    this.itemLabelPerListeVerfuegbar.putAll(listenVerfuegbar.stream().collect(toMap(liste -> liste, Liste::getKurznameAufGebiet)));

    this.itemComparator = itemComparator;
  }

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

  @Override
  protected String getSourceCaptionMessageKey() {
    return "listenverbindung.edit.liste.source";
  }

  @Override
  protected String getTargetCaptionMessageKey() {
    return "listenverbindung.edit.liste.target";
  }

  @Override
  protected List<Liste> getVerfuegbareElemente() {
    List<Liste> result = new ArrayList<>(listenVerfuegbar);
    result.removeAll(getZugeordneteElemente());

    Collections.sort(result, itemComparator);

    return result;
  }

  @Override
  protected List<Liste> getZugeordneteElemente() {
    List<Liste> result = new ArrayList<>(listenverbindung.getListen());

    Collections.sort(result, itemComparator);

    return result;
  }

  @Override
  protected void setzeZugeordneteElemente(List<Liste> listen) {
    listenverbindung.removeAllListeByListenverbindungs();

    for (Liste liste : listen) {
      listenverbindung.addListeByListenverbindung(liste);
    }
  }

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

  @Override
  public String getItemLabel(Liste liste) {
    return itemLabelPerListeVerfuegbar.getOrDefault(liste, liste.getKurznameAufGebiet());
  }

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