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

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

import de.ivu.elect.business.stimmeingabe.entity.Stimmeingabe;
import de.ivu.elect.business.stimmeingabe.entity.StimmeingabePlausiKonfiguration;
import de.ivu.elect.jee.faces.Messages;

public abstract class AbstractKommunalListenwahlGueltigeListenstimmenBerechnetAnzahlComparedToTheoretischesMaximumPlausi extends AbstractStimmeingabeAnzahlComparedToPlausi
    implements
      StimmeingabePlausiAnzahlBerechnet,
      StimmeingabePlausiAnzahlComparedToTheoretischesMaximum {

  private final Stimmeingabe stimmeingabeWaehlerGesamt;

  private final Stimmeingabe stimmzetteleingabeUngueltigeListenstimmen;

  protected AbstractKommunalListenwahlGueltigeListenstimmenBerechnetAnzahlComparedToTheoretischesMaximumPlausi(StimmeingabeAnzahlComparedToOperator comparedToOperator,
      Stimmeingabe stimmeingabeWaehlerGesamt, Stimmeingabe stimmzetteleingabeUngueltigeListenstimmen, StimmeingabePlausiKonfiguration stimmeingabePlausiKonfiguration, Messages messages) {
    super(new StimmeingabeAnzahlComparedToStimmeingabeAnzahlenPlausiDefinition(StimmeingabeAnzahlReference.SYSTEM_GRUPPE_GUELTIGE_LISTENSTIMMEN_BERECHNET, comparedToOperator,
        StimmeingabeAnzahlReference.SYSTEM_GRUPPE_WAEHLER_GESAMT, StimmeingabeAnzahlReference.SYSTEM_GRUPPE_UNGUELTIGE_LISTENSTIMMEN), stimmeingabePlausiKonfiguration, messages);

    this.stimmeingabeWaehlerGesamt = stimmeingabeWaehlerGesamt;

    this.stimmzetteleingabeUngueltigeListenstimmen = stimmzetteleingabeUngueltigeListenstimmen;
  }

  @Override
  protected boolean isPlausibilisierenZulaessig(Stimmeingabe stimmeingabe) {
    return super.isPlausibilisierenZulaessig(stimmeingabe) && getAnzahlStimmenGueltig() > 0L;
  }

  @Override
  protected Long getStimmeingabeAnzahl(Stimmeingabe ignored) {
    return getAnzahlStimmenGueltig();
  }

  protected abstract long getAnzahlStimmenGueltig();

  @Override
  protected Long getComparedToValue() {
    return getAnzahlStimmenProWaehlerMaximal() * getAnzahlStimmzettelGueltig();
  }

  protected abstract long getAnzahlStimmenProWaehlerMaximal();

  protected long getAnzahlWaehlerGesamt() {
    return fixNullToZero(stimmeingabeWaehlerGesamt);
  }

  protected long getAnzahlStimmzettelGueltig() {
    return getAnzahlWaehlerGesamt() - getAnzahlStimmzettelUngueltig();
  }

  protected long getAnzahlStimmzettelUngueltig() {
    return fixNullToZero(stimmzetteleingabeUngueltigeListenstimmen);
  }

  @Override
  protected List<Object> getStimmeingabefehlerBeschreibungParameters(Stimmeingabe stimmeingabe) {
    List<Object> result = new ArrayList<>(super.getStimmeingabefehlerBeschreibungParameters(stimmeingabe));
    result.add(getAnzahlStimmenProWaehlerMaximal());
    result.add(getAnzahlStimmzettelGueltig());

    return result;
  }
}
