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

import java.io.Serializable;
import java.util.function.Predicate;

import javax.inject.Inject;

import de.ivu.elect.business.gruppe.entity.Gruppe;
import de.ivu.elect.business.kandidatur.boundary.WaehlerBenannteKandidaturKonfiguration;
import de.ivu.elect.business.wahl.entity.AbstractWahlParameterLoader;
import de.ivu.elect.business.wahl.entity.Wahl;
import de.ivu.elect.business.wahl.entity.WahlParameterWerte;
import de.ivu.elect.business.wahl.entity.WahlartErgebnisart;
import de.ivu.elect.business.wahl.entity.WahlartErgebnisartVorlaeufigErfassungsart;

public abstract class AbstractStimmeingabeKonfiguration implements Serializable {

  private static final long serialVersionUID = 1L;

  @Inject
  private transient WaehlerBenannteKandidaturKonfiguration waehlerBenannteKandidaturKonfiguration;

  public AbstractStimmeingabeKonfiguration() {
    super();
  }

  public boolean isWaehlerBenannteListeGruppe(Gruppe gruppe) {
    return getWaehlerBenannteKandidaturKonfiguration().isWaehlerBenannteListeGruppe(gruppe);
  }

  protected WaehlerBenannteKandidaturKonfiguration getWaehlerBenannteKandidaturKonfiguration() {
    return waehlerBenannteKandidaturKonfiguration;
  }

  public boolean isErgebniseingangContainsStimmenKomplett(Wahl wahl, WahlartErgebnisart ergebnisart) {
    return true;
  }

  public boolean isErgebnismeldungEndgueltigKomplett(AbstractWahlParameterLoader wahlParameterLoader, Wahl wahl, WahlartErgebnisart ergebnisart) {
    return ergebnisart != null && ergebnisart.isEndgueltig();
  }

  public boolean isErgebnismeldungVorlaeufigKomplett(AbstractWahlParameterLoader wahlParameterLoader, Wahl wahl, WahlartErgebnisart ergebnisart) {
    return ergebnisart != null && ergebnisart.isVorlaeufig() && isErgebnismeldungVorlaeufigKomplettConfigured(wahlParameterLoader, wahl);
  }

  public boolean isErgebnismeldungVorlaeufigKomplettConfigured(AbstractWahlParameterLoader wahlParameterLoader, Wahl wahl) {
    return isWahlartErgebnisartVorlaeufigErfassungsartConfigured(wahlParameterLoader, wahl,
        wahlartErgebnisartVorlaeufigErfassungsart -> wahlartErgebnisartVorlaeufigErfassungsart.isStimmenKomplettErfassbar(wahl));
  }

  protected boolean isWahlartErgebnisartVorlaeufigErfassungsartConfigured(AbstractWahlParameterLoader wahlParameterLoader, Wahl wahl, Predicate<WahlartErgebnisartVorlaeufigErfassungsart> predicate) {
    if (wahl != null) {
      return predicate.test(getWahlartErgebnisartVorlaeufigErfassungsart(wahlParameterLoader, wahl));
    }

    return false;
  }

  protected WahlartErgebnisartVorlaeufigErfassungsart getWahlartErgebnisartVorlaeufigErfassungsart(AbstractWahlParameterLoader wahlParameterLoader, Wahl wahl) {
    WahlartErgebnisartVorlaeufigErfassungsart result = wahlParameterLoader.resolveEnumValue(wahl, WahlParameterWerte.STIMMEINGABE_WAHLART_ERGEBNISART_VORLAEUFIG_ERFASSUNGSART,
        WahlartErgebnisartVorlaeufigErfassungsart.class);

    if (result == null) {
      result = WahlartErgebnisartVorlaeufigErfassungsart.ERGEBNIS_KOMPLETT;
    }

    return result;
  }
}
