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

import java.util.Collection;

import de.ivu.elect.business.stimmeingabe.entity.Stimmeingabe;

public abstract class AbstractKommunalListenwahlStimmeingabenGueltigeListenstimmen implements KommunalListenwahlStimmeingabenGueltigeListenstimmen {

  private final boolean stimmzettelNurEinzelnerWahlvorschlagUnveraendertManuellAuszuzaehlen;

  protected AbstractKommunalListenwahlStimmeingabenGueltigeListenstimmen(boolean stimmzettelNurEinzelnerWahlvorschlagUnveraendertManuellAuszuzaehlen) {
    super();

    this.stimmzettelNurEinzelnerWahlvorschlagUnveraendertManuellAuszuzaehlen = stimmzettelNurEinzelnerWahlvorschlagUnveraendertManuellAuszuzaehlen;
  }

  @Override
  public boolean isStimmzettelNurEinzelnerWahlvorschlagUnveraendertManuellAuszuzaehlen() {
    return stimmzettelNurEinzelnerWahlvorschlagUnveraendertManuellAuszuzaehlen;
  }

  @Override
  public long getAnzahlStimmzettelNurEinzelnerWahlvorschlag() {
    return getAnzahlStimmzettelNurEinzelnerWahlvorschlagUnveraendert() + getAnzahlStimmzettelNurEinzelnerWahlvorschlagVeraendert();
  }

  @Override
  public long getAnzahlStimmenErfasstExcludingStimmzettelNurEinzelnerWahlvorschlagUnveraendert(long anzahlStimmenProWaehlerFuerListe) {
    long result = getAnzahlStimmenErfasst();

    if (isStimmzettelNurEinzelnerWahlvorschlagUnveraendertManuellAuszuzaehlen()) {
      result -= anzahlStimmenProWaehlerFuerListe * getAnzahlStimmzettelNurEinzelnerWahlvorschlagUnveraendert();
    }

    return result;
  }

  @Override
  public long getAnzahlStimmenErfasstIncludingStimmzettelNurEinzelnerWahlvorschlagUnveraendert(long anzahlStimmenProWaehlerFuerListe) {
    long result = getAnzahlStimmenErfasst();

    if (!isStimmzettelNurEinzelnerWahlvorschlagUnveraendertManuellAuszuzaehlen()) {
      result += anzahlStimmenProWaehlerFuerListe * getAnzahlStimmzettelNurEinzelnerWahlvorschlagUnveraendert();
    }

    return result;
  }

  protected static boolean existsStimmeingabe(Collection<Stimmeingabe> stimmeingaben) {
    return stimmeingaben != null && stimmeingaben.stream().anyMatch(AbstractKommunalListenwahlStimmeingabenGueltigeListenstimmen::existsStimmeingabe);
  }

  protected static boolean existsStimmeingabe(Stimmeingabe stimmeingabe) {
    return stimmeingabe != null;
  }

  protected static long fixNonPositiveToZero(Collection<Stimmeingabe> stimmeingaben) {
    if (stimmeingaben != null) {
      return stimmeingaben.stream().mapToLong(AbstractKommunalListenwahlStimmeingabenGueltigeListenstimmen::fixNonPositiveToZero).sum();
    }

    return 0L;
  }

  protected static long fixNonPositiveToZero(Stimmeingabe stimmeingabe) {
    if (stimmeingabe != null) {
      return fixNonPositiveToZero(stimmeingabe.getAnzahl());
    }

    return 0L;
  }

  protected static long fixNonPositiveToZero(Long value) {
    if (value != null && value > 0L) {
      return value;
    }

    return 0L;
  }
}
