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

import java.util.Arrays;
import java.util.Collection;
import java.util.List;
import java.util.stream.Collectors;

import de.ivu.elect.business.stimmzettel.entity.EntityAufStimmzettelDaten;
import de.ivu.elect.business.wahlvorschlag.entity.AbstractWahlvorschlag;
import de.ivu.elect.business.wahlvorschlag.entity.Liste;
import de.ivu.elect.business.wahlvorschlag.entity.NlListe;

public enum NlPolitischeGruppeArt {

  /**
   * - Einzelliste <-> existiert genau eine Liste
   * - Identische Liste <-> Es gibt mindestens 2 Listen und alle Listen der Gruppe sind identisch
   * - lijstengroep: f(gruppe) != Einzelliste && f(gruppe)!=identische liste
   */

  EINZELLISTE {
    @Override
    public boolean isEinzelliste() {
      return true;
    }

//    @Override
//    protected boolean isAccept(Collection<Liste> alleListen, EntityAufStimmzettelDaten entityAufStimmzettelDaten) {
//      return alleListen.size() == 1;
//
//    }
  },
  IDENTISCHE_LISTE {
    @Override
    public boolean isIdentischeListe() {
      return true;
    }

//    @Override
//    protected boolean isAccept(Collection<Liste> alleListen, EntityAufStimmzettelDaten entityAufStimmzettelDaten) {
//      return alleListen.size() > 1 && isAlleListenIdentisch(alleListen, entityAufStimmzettelDaten);
//    }

    private boolean isAlleListenIdentisch(Collection<Liste> alleListen, EntityAufStimmzettelDaten entityAufStimmzettelDaten) {
      return alleListen.stream().noneMatch(liste1 -> alleListen.stream().anyMatch(liste2 -> !NlListe.isIdentisch(liste1, liste2, entityAufStimmzettelDaten)));
    }
  },
  LISTENGRUPPE {
    @Override
    public boolean isListengruppe() {
      return true;
    }

//    @Override
//    protected boolean isAccept(Collection<Liste> alleListen, EntityAufStimmzettelDaten entityAufStimmzettelDaten) {
//      return !EINZELLISTE.isAccept(alleListen, entityAufStimmzettelDaten) && !IDENTISCHE_LISTE.isAccept(alleListen, entityAufStimmzettelDaten);
//    }
  },
  ABGELEHNT{
//    @Override
//    protected boolean isAccept(Collection<Liste> alleListen, EntityAufStimmzettelDaten entityAufStimmzettelDaten) {
//
//      return false;
//    }

    @Override
    public boolean isAbgelehnt() {
      return true;
    }
  },
  UNBEKANNT {
//    @Override
//    protected boolean isAccept(Collection<Liste> alleListen, EntityAufStimmzettelDaten entityAufStimmzettelDaten) {
//      return false;
//    }

    @Override
    public boolean isUnbekannt() {
      return true;
    }
  };

  public boolean isEinzelliste() {
    return false;
  }

  public boolean isIdentischeListe() {
    return false;
  }

  public boolean isListengruppe() {
    return false;
  }

  public boolean isUnbekannt() {
    return false;
  }
  public boolean isAbgelehnt() {
    return false;
  }

//  public static NlPolitischeGruppeArt bestimme(Collection<Liste> alleListen, EntityAufStimmzettelDaten entityAufStimmzettelDaten) {
//    List<Liste> alleZugelassenenListen = alleListen.stream().filter(AbstractWahlvorschlag::isZugelassenOderUnbestimmt).collect(Collectors.toList());
//    if (alleZugelassenenListen.isEmpty()) {
//      return UNBEKANNT;
//    }
//    return Arrays.stream(values()).filter(value -> value.isAccept(alleZugelassenenListen, entityAufStimmzettelDaten)).findFirst().orElse(UNBEKANNT);
//  }
//
//  protected abstract boolean isAccept(Collection<Liste> alleListen, EntityAufStimmzettelDaten entityAufStimmzettelDaten);

}
