
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 class KommunalListenwahlGruppeListenkandidaturenGesamtZwischensummeGroesserGleichTheoretischesMinimumPlausi extends AbstractStimmeingabeAnzahlComparedToPlausi
    implements
      StimmeingabePlausiAnzahlComparedToTheoretischesMinimum {

  private final long anzahlStimmenProWaehlerFuerListeMaximal;

  private final boolean stimmzettelNurEinzelnerWahlvorschlagUnveraendertManuellAuszuzaehlen;

  private final Stimmeingabe stimmzetteleingabeGruppeNurEinzelnerWahlvorschlagUnveraendert;

  private final Stimmeingabe stimmzetteleingabeGruppeNurEinzelnerWahlvorschlagVeraendert;

  public KommunalListenwahlGruppeListenkandidaturenGesamtZwischensummeGroesserGleichTheoretischesMinimumPlausi(Long anzahlStimmenProWaehlerFuerListeMaximal,
      boolean stimmzettelNurEinzelnerWahlvorschlagUnveraendertManuellAuszuzaehlen, Stimmeingabe stimmzetteleingabeGruppeNurEinzelnerWahlvorschlagUnveraendert,
      Stimmeingabe stimmzetteleingabeGruppeNurEinzelnerWahlvorschlagVeraendert, StimmeingabePlausiKonfiguration stimmeingabePlausiKonfiguration, Messages messages) {
    super(new StimmeingabeAnzahlComparedToStimmeingabeAnzahlenPlausiDefinition(StimmeingabeAnzahlReference.GRUPPE_LISTENSTIMMEN_LISTENKANDIDATUREN_GESAMT,
        StimmeingabeAnzahlComparedToOperator.GREATER_THAN_OR_EQUAL_TO, StimmeingabeAnzahlReference.GRUPPE_LISTENSTIMMEN_NUR_EINZELNER_WAHLVORSCHLAG_UNVERAENDERT,
        StimmeingabeAnzahlReference.GRUPPE_LISTENSTIMMEN_NUR_EINZELNER_WAHLVORSCHLAG_VERAENDERT), stimmeingabePlausiKonfiguration, messages);

    // Minimum aus Anzahl Nennungen AUF DER Liste und Anzahl Stimmen pro Wähler maximal!
    this.anzahlStimmenProWaehlerFuerListeMaximal = fixNullToZero(anzahlStimmenProWaehlerFuerListeMaximal);

    this.stimmzettelNurEinzelnerWahlvorschlagUnveraendertManuellAuszuzaehlen = stimmzettelNurEinzelnerWahlvorschlagUnveraendertManuellAuszuzaehlen;

    this.stimmzetteleingabeGruppeNurEinzelnerWahlvorschlagUnveraendert = stimmzetteleingabeGruppeNurEinzelnerWahlvorschlagUnveraendert;
    this.stimmzetteleingabeGruppeNurEinzelnerWahlvorschlagVeraendert = stimmzetteleingabeGruppeNurEinzelnerWahlvorschlagVeraendert;
  }

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

  @Override
  protected Long getComparedToValue() {
    return getAnzahlStimmenNurEinzelnerWahlvorschlagUnveraendert() + getAnzahlStimmenNurEinzelnerWahlvorschlagVeraendert();
  }

  private long getAnzahlStimmenNurEinzelnerWahlvorschlagUnveraendert() {
    return getAnzahlStimmenProWaehlerFuerListeMaximal() * getAnzahlStimmzettelNurEinzelnerWahlvorschlagUnveraendert();
  }

  private long getAnzahlStimmenProWaehlerFuerListeMaximal() {
    return anzahlStimmenProWaehlerFuerListeMaximal;
  }

  private Long getAnzahlStimmzettelNurEinzelnerWahlvorschlagUnveraendert() {
    return fixNullToZero(stimmzetteleingabeGruppeNurEinzelnerWahlvorschlagUnveraendert);
  }

  private long getAnzahlStimmenNurEinzelnerWahlvorschlagVeraendert() {
    return getAnzahlStimmzettelNurEinzelnerWahlvorschlagVeraendert();
  }

  private Long getAnzahlStimmzettelNurEinzelnerWahlvorschlagVeraendert() {
    return fixNullToZero(stimmzetteleingabeGruppeNurEinzelnerWahlvorschlagVeraendert);
  }

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

    return result;
  }
}
