
package de.ivu.elect.sitzberechnung.konflikt;

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

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

import javax.annotation.Nullable;

import de.ivu.elect.sitzberechnung.SitzberechnungEntity;

public abstract class AbstractErgebnisKonfliktEntitiesAuswaehlen extends AbstractErgebnisKonflikt {

  private final String wahlgebietKey;

  private final String wahlvorschlaggebietKey;

  private final Enum< ? > typ;

  private final long anzahlAuszuwaehlen;

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

    this.wahlgebietKey = wahlgebietKey;

    this.wahlvorschlaggebietKey = wahlvorschlaggebietKey;

    this.typ = typ;

    this.anzahlAuszuwaehlen = anzahlAuszuwaehlen;
  }

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

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

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

  public long getAnzahlAuszuwaehlen() {
    return anzahlAuszuwaehlen;
  }

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

  protected static <E extends SitzberechnungEntity> List<E> filterEntitiesByEntityKeys(Collection<E> entities, Collection<String> entityKeys) {
    return entities.stream().filter(entity -> entityKeys.contains(entity.getKey())).collect(toList());
  }
}
