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

import static org.apache.commons.lang3.StringUtils.isNotBlank;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;

import javax.inject.Inject;

import de.ivu.elect.business.kandidatur.entity.Kandidatur;
import de.ivu.elect.business.stimmzettel.entity.EntityAufStimmzettelDaten;
import de.ivu.elect.business.wahlvorschlag.entity.Wahlvorschlag;
import de.ivu.elect.business.wahlvorschlagsperson.boundary.AbstractWahlvorschlagsPersonDAO;

public class WusZulassungPruefProzess implements Serializable {

  private static final long serialVersionUID = 1L;

  @Inject
  private transient KandidaturPersonStatusZulassungPruefSchritt kandidaturPersonStatusZulassungPruefSchritt;

  @Inject
  private transient WahlvorschlagUnterstuetzerAnzahlErforderlichZulassungPruefSchritt wahlvorschlagUnterstuetzerAnzahlErforderlichZulassungPruefSchritt;

  @Inject
  private transient ListeListenkandidaturenAnzahlMaximalZulassungPruefSchritt listeListenkandidaturenAnzahlMaximalZulassungPruefSchritt;

  public WusZulassungPruefProzess() {
    super();
  }

  public List<KandidaturZulassungPruefSchritt> getKandidaturPruefSchritte() {
    List<KandidaturZulassungPruefSchritt> result = new ArrayList<>();

    result.add(kandidaturPersonStatusZulassungPruefSchritt);

    return result;
  }

  public boolean isZulassungErlaubt(Kandidatur kandidatur, EntityAufStimmzettelDaten entityAufStimmzettelDaten) {
    return getKandidaturPruefSchritte().stream().allMatch(pruefSchritt -> pruefSchritt.isZulassungErlaubt(kandidatur, entityAufStimmzettelDaten));
  }

  public void addGruendeFuerVerweigerungDerZulassung(List<String> result, Kandidatur kandidatur, EntityAufStimmzettelDaten entityAufStimmzettelDaten) {
    for (KandidaturZulassungPruefSchritt pruefSchritt : getKandidaturPruefSchritte()) {
      if (!pruefSchritt.isZulassungErlaubt(kandidatur, entityAufStimmzettelDaten)) {
        addGrundFuerVerweigerungDerZulassung(result, pruefSchritt.getGrundFuerVerweigerungDerZulassung(kandidatur));
      }
    }
  }

  public List<WahlvorschlagZulassungPruefSchritt> getWahlvorschlagPruefSchritte() {
    List<WahlvorschlagZulassungPruefSchritt> result = new ArrayList<>();

    result.add(wahlvorschlagUnterstuetzerAnzahlErforderlichZulassungPruefSchritt);

    result.add(listeListenkandidaturenAnzahlMaximalZulassungPruefSchritt);

    return result;
  }

  public boolean isZulassungErlaubt(Wahlvorschlag wahlvorschlag, AbstractWahlvorschlagsPersonDAO wahlvorschlagsPersonDAO, EntityAufStimmzettelDaten entityAufStimmzettelDaten) {
    return getWahlvorschlagPruefSchritte().stream().allMatch(pruefSchritt -> pruefSchritt.isZulassungErlaubt(wahlvorschlag, wahlvorschlagsPersonDAO, entityAufStimmzettelDaten));
  }

  public void addGruendeFuerVerweigerungDerZulassung(List<String> result, Wahlvorschlag wahlvorschlag, AbstractWahlvorschlagsPersonDAO wahlvorschlagsPersonDAO,
      EntityAufStimmzettelDaten entityAufStimmzettelDaten) {
    for (WahlvorschlagZulassungPruefSchritt pruefSchritt : getWahlvorschlagPruefSchritte()) {
      if (!pruefSchritt.isZulassungErlaubt(wahlvorschlag, wahlvorschlagsPersonDAO, entityAufStimmzettelDaten)) {
        addGrundFuerVerweigerungDerZulassung(result, pruefSchritt.getGrundFuerVerweigerungDerZulassung(wahlvorschlag));
      }
    }
  }

  protected void addGrundFuerVerweigerungDerZulassung(List<String> result, String grundFuerVerweigerungDerZulassung) {
    if (isNotBlank(grundFuerVerweigerungDerZulassung) && !result.contains(grundFuerVerweigerungDerZulassung)) {
      result.add(grundFuerVerweigerungDerZulassung);
    }
  }
}
