package de.ivu.elect.business.kandidatur.control;

import java.util.ArrayList;
import java.util.List;

import de.ivu.elect.business.gebietsbaum.entity.Gebiet;
import de.ivu.elect.business.kandidatur.entity.Kandidatur;

public class KandidaturFilter {

  public <K extends Kandidatur> List<K> filterAufStimmzettelUndInGebiet(List<K> alle, Gebiet gebietSelected) {

    List<K> result = new ArrayList<>(alle.size());
    for (K kandidatur : alle) {
      if (kandidatur.getWahlvorschlag().isUngeprueftOderAufStimmzettel() && isInGebiet(kandidatur, gebietSelected)) {
        result.add(kandidatur);
      }
    }

    return result;
  }

  /**
   * <=> Kandidatur tritt in Gebiet unterhalb des ausgewählten Gebietes an, oder überhalb (Aber nicht in Nachbarzweigen)
   */
  public <K extends Kandidatur> boolean isInGebiet(K kandidatur, Gebiet gebietSelected) {
    Gebiet gebietDerKandidatur = kandidatur.getGebiet();

    // DB Zugriffe vermeiden => zweimal nach oben gehen
    return gebietSelected.isInGebietshierarchieUntergeordnetesGebietVon(gebietDerKandidatur) || gebietDerKandidatur
        .isInGebietshierarchieUntergeordnetesGebietVon(gebietSelected);

  }
}
