
package de.ivu.elect.sitzberechnung.konflikt;

import static java.util.Collections.emptyList;
import static java.util.stream.Collectors.toList;

import java.util.Collection;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Objects;

import javax.annotation.Nullable;

import de.ivu.elect.sitzberechnung.SitzberechnungEntity;

public abstract class AbstractErgebnisKonfliktEntitiesSortieren extends AbstractErgebnisKonflikt {

  private final String wahlgebietKey;

  private final String wahlvorschlaggebietKey;

  private final Enum< ? > typ;

  protected AbstractErgebnisKonfliktEntitiesSortieren(String wahlgebietKey, String wahlvorschlaggebietKey, Enum< ? > typ, ErgebnisKonfliktStatus ergebnisKonfliktStatus) {
    super(ergebnisKonfliktStatus, 0L);

    this.wahlgebietKey = wahlgebietKey;

    this.wahlvorschlaggebietKey = wahlvorschlaggebietKey;

    this.typ = typ;
  }

  @Nullable
  public String getWahlgebietKey() {
    return wahlgebietKey;
  }

  @Nullable
  public String getWahlvorschlaggebietKey() {
    return wahlvorschlaggebietKey;
  }

  public Enum< ? > getLosentscheidTyp() {
    return typ;
  }

  protected boolean isFachlichGleich(AbstractErgebnisKonfliktEntitiesSortieren other) {
    return Objects.equals(getWahlvorschlaggebietKey(), other.getWahlgebietKey()) && Objects.equals(getWahlvorschlaggebietKey(), other.getWahlvorschlaggebietKey());
  }

  protected static <E extends SitzberechnungEntity> List<E> filterEntitiesByEntityKeys(Collection<E> entities, Collection<String> entityKeys) {
    if (entities.isEmpty() || entityKeys.isEmpty()) {
      return emptyList();
    }

    Map<String, E> entityPerEntityKey = new HashMap<>();

    for (E entity : entities) {
      String entityKey = entity.getKey();

      if (entityKey != null && !entityKey.isBlank()) {
        entityPerEntityKey.computeIfAbsent(entityKey, ignored -> entity);
      }
    }

    return entityKeys.stream().map(entityPerEntityKey::get).filter(Objects::nonNull).collect(toList()); // ELECT-15978, Reihenfolge der gesuchten/SORTIERTEN Keys erhalten!!!
  }
}
