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

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

import javax.annotation.Nonnull;
import javax.annotation.Nullable;
import javax.enterprise.context.ApplicationScoped;

import de.ivu.elect.business.gebietsbaum.entity.Wahldurchfuehrungsgebiet;
import de.ivu.elect.business.sitzberechnung.entity.SitzberechnungsalgorithmusKonfiguration;
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;
import de.ivu.elect.business.wahlvorschlag.entity.Liste;
import de.ivu.elect.business.wahlvorschlag.entity.Wahlvorschlag;

@ApplicationScoped // ELECT-7845
public abstract class AbstractSitzberechnungsalgorithmus<K extends SitzberechnungsalgorithmusKonfiguration> implements Sitzberechnungsalgorithmus<K>, Serializable {

  private static final long serialVersionUID = 1L;

  public AbstractSitzberechnungsalgorithmus() {
    super();
  }

  @Override
  public boolean isMarkiertGewaehlte(AbstractWahlParameterLoader wahlParameterLoader, Wahl wahl, WahlartErgebnisart ergebnisart) {
    return true; // To be overridden...
  }

  @Override
  public boolean isErstelltDHondtQuotientPolitischeGruppe() {
    return false;
  }

  @Override
  public boolean isErstelltDHondtQuotientListenInGruppe() {
    return false;
  }

  @Override
  public boolean isErstelltDHondtQuotientListenInListenverbindung() {
    return false;
  }

  @Override
  public boolean isErstelltDHondtQuotientListenImGebiet() {
    return false;
  }

  @Override
  public boolean isBerechnetErgebnisFallsWaehlerBenannteWahlvorschlaegeSonstigeErfasst() {
    return isBerechnetErgebnis();
  }

  @Override
  public boolean isWaehlerBenannteWahlvorschlaegeErfassbar(Wahldurchfuehrungsgebiet wahldurchfuehrungsgebiet, Collection< ? extends Wahlvorschlag> wahlvorschlaege) {
    return false;
  }

  @Nullable
  @Override
  public Wahldurchfuehrungsgebiet getWaehlerBenannteListeListengebietFuerErfassungsgebiet(Wahldurchfuehrungsgebiet erfassungsgebiet,
      Function<Wahldurchfuehrungsgebiet, Collection<Liste>> listenByGebietFunction) {
    return NICHT_UNTERSTUETZT;
  }

  @Nonnull
  protected WahlartErgebnisartVorlaeufigErfassungsart resolveWahlartErgebnisartVorlaeufigErfassungsartConfigured(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;
  }

  @Override
  public String toString() {
    return getClass().getName();
  }
}
