package de.ivu.elect.business.stimmzettel.boundary;

import java.io.Serializable;
import java.util.List;
import java.util.function.Function;

import de.ivu.elect.business.gebietsbaum.entity.Gebiet;
import de.ivu.elect.business.wahl.entity.Wahl;
import de.ivu.elect.business.wahlvorschlag.entity.Wahlvorschlag;

public class StimmzettelGebietErmittler implements Serializable {


  public boolean isStimmzettelGebietOderDarunter(Gebiet gebiet, Function<Wahl, List<Wahlvorschlag>> wahlvorschlaegeFct) {

    if (gebiet==null || gebiet.getWahl()==null){
      return false;
    }

    Wahl wahl = gebiet.getWahl();

    // Für Destatis Reihenfolge Direktkandidat prüfen, Liste prüfen korrekt
    if (wahl.isWahlMitDirektkandidatengebieten()) {
      // keine Direktlkandidat darf unterhalb vom aktuellen Gebiet liegen
      return wahlvorschlaegeFct.apply(wahl).stream()
          .noneMatch(wahlvorschlag -> wahlvorschlag.isDirektkandidat() && wahlvorschlag.getGebiet().isUntergebietVon(gebiet));
    } else if (wahl.isWahlMitListengebieten()) {
      // keine Liste darf unterhalb vom aktuellen Gebiet liegen
      return wahlvorschlaegeFct.apply(wahl).stream()
          .noneMatch(wahlvorschlag -> wahlvorschlag.isListe() && wahlvorschlag.getGebiet().isUntergebietVon(gebiet));
    }

    return false;
  }


}
