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

import java.io.Serializable;

import de.ivu.elect.business.kandidatur.boundary.WaehlerBenannteKandidaturKonfiguration;
import de.ivu.elect.business.kandidatur.entity.Kandidatur;
import de.ivu.elect.business.kandidatur.entity.KandidaturStatus;
import de.ivu.elect.business.pruefung.boundary.ZulassungPruefer;
import de.ivu.elect.business.wahl.boundary.WahlZulassungspruefung;
import de.ivu.elect.business.wahl.entity.Wahl;
import de.ivu.elect.business.wahl.entity.Zulassungspruefung;
import de.ivu.elect.business.wahlrechtspruefung.boundary.ZulassungspruefungRegeln;
import de.ivu.elect.business.wahlvorschlag.entity.Wahlvorschlag;
import de.ivu.elect.business.wahlvorschlag.entity.WahlvorschlagStatus;

public abstract class AbstractWahlZulassungspruefung implements Serializable {

  private static final long serialVersionUID = 1L;

  protected abstract ZulassungspruefungRegeln getZulassungspruefungRegeln();

  protected WahlZulassungspruefung getWahlZulassungspruefung() {
    Wahl wahl = getWahl();

    if (wahl != null) {
      return new WahlZulassungspruefung(wahl, getZulassungPruefer(), getWaehlerBenannteKandidaturKonfiguration());
    }

    return new WahlZulassungspruefung(Zulassungspruefung.DEAKTIVIERT_NUR_ZUGELASSENE_WAHLVORSCHLAEGE, getZulassungPruefer(),
        getWaehlerBenannteKandidaturKonfiguration());
  }

  protected abstract WaehlerBenannteKandidaturKonfiguration getWaehlerBenannteKandidaturKonfiguration();


  protected abstract ZulassungPruefer getZulassungPruefer();

  protected abstract Wahl getWahl();

  public boolean isZulassungMitPruefkriterienDurchfuehrbar() {
    return getZulassungspruefungRegeln().isZulassungMitPruefkriterienDurchfuehrbar(getWahlZulassungspruefung());
  }

  public boolean isZulassungMitPruefkriterienZulaessig(Wahlvorschlag wahlvorschlag) {
    return getZulassungspruefungRegeln().isZulassungMitPruefkriterienZulaessig(wahlvorschlag, getWahlZulassungspruefung());
  }

  public boolean isZulassungMitPruefkriterienZulaessig(Kandidatur kandidatur) {
    return getZulassungspruefungRegeln().isZulassungMitPruefkriterienZulaessig(kandidatur, getWahlZulassungspruefung());
  }

  public boolean isZulassungBearbeitbar() {
    return getZulassungspruefungRegeln().isZulassungBearbeitbar(getWahlZulassungspruefung());
  }

  public boolean isZulassungAktiviert() {
    return getZulassungspruefungRegeln().isZulassungAktiviert(getWahlZulassungspruefung());
  }

  public boolean isZulassungBestaetigenZulaessig(Wahlvorschlag wahlvorschlag) {
    return getZulassungspruefungRegeln().isZulassungBestaetigenZulaessig(wahlvorschlag, getWahlZulassungspruefung());
  }

  public boolean isZulassungAblehnenZulaessig(Wahlvorschlag wahlvorschlag) {
    return getZulassungspruefungRegeln().isZulassungAblehnenZulaessig(wahlvorschlag, getWahlZulassungspruefung());
  }

  public boolean isZulassungZuruecksetzenZulaessig(Wahlvorschlag wahlvorschlag) {
    return getZulassungspruefungRegeln().isZulassungZuruecksetzenZulaessig(wahlvorschlag, getWahlZulassungspruefung());
  }

  public boolean isZulassungAufhebenKeineZulassungsfaehigkeitBeimZulassungsausschussZulaessig(Wahlvorschlag wahlvorschlag) {
    return getZulassungspruefungRegeln()
        .isZulassungAufhebenKeineZulassungsfaehigkeitBeimZulassungsausschussZulaessig(wahlvorschlag, getWahlZulassungspruefung());
  }

  public boolean isZulassungAufhebenKeineZulassungsfaehigkeitNachZulassungsausschussZulaessig(Wahlvorschlag wahlvorschlag) {
    return getZulassungspruefungRegeln()
        .isZulassungAufhebenKeineZulassungsfaehigkeitNachZulassungsausschussZulaessig(wahlvorschlag, getWahlZulassungspruefung());
  }

  public WahlvorschlagStatus getZulassungWahlvorschlagStatusInitial() {
    return getZulassungspruefungRegeln().getZulassungWahlvorschlagStatusInitial(getWahlZulassungspruefung());
  }

  public boolean isZulassungBestaetigenZulaessig(Kandidatur kandidatur) {
    return getZulassungspruefungRegeln().isZulassungBestaetigenZulaessig(kandidatur, getWahlZulassungspruefung());
  }

  public boolean isZulassungBestaetigenNachtraeglichAmtsannahmeUnzulaessigZulaessig(Kandidatur kandidatur) {
    return getZulassungspruefungRegeln().isZulassungBestaetigenNachtraeglichAmtsannahmeUnzulaessigZulaessig(kandidatur, getWahlZulassungspruefung());
  }

  public boolean isZulassungBestaetigenNachtraeglichAmtsannahmeVerweigertZulaessig(Kandidatur kandidatur) {
    return getZulassungspruefungRegeln().isZulassungBestaetigenNachtraeglichAmtsannahmeVerweigertZulaessig(kandidatur, getWahlZulassungspruefung());
  }

  public boolean isZulassungAblehnenZulaessig(Kandidatur kandidatur) {
    return getZulassungspruefungRegeln().isZulassungAblehnenZulaessig(kandidatur, getWahlZulassungspruefung());
  }

  public boolean isZulassungZuruecksetzenZulaessig(Kandidatur kandidatur) {
    return getZulassungspruefungRegeln().isZulassungZuruecksetzenZulaessig(kandidatur, getWahlZulassungspruefung());
  }

  public boolean isZulassungAufhebenKeineZulassungsfaehigkeitBeimZulassungsausschussZulaessig(Kandidatur kandidatur) {
    return getZulassungspruefungRegeln().isZulassungAufhebenKeineZulassungsfaehigkeitBeimZulassungsausschussZulaessig(kandidatur, getWahlZulassungspruefung());
  }

  public boolean isZulassungAufhebenKeineZulassungsfaehigkeitNachZulassungsausschussZulaessig(Kandidatur kandidatur) {
    return getZulassungspruefungRegeln().isZulassungAufhebenKeineZulassungsfaehigkeitNachZulassungsausschussZulaessig(kandidatur, getWahlZulassungspruefung());
  }

  public KandidaturStatus getZulassungKandidaturStatusInitial() {
    return getZulassungspruefungRegeln().getZulassungKandidaturStatusInitial(getWahlZulassungspruefung());
  }

}
