
package de.ivu.elect.business.verteilung.boundary;

import java.util.List;
import java.util.Optional;

public class VerteilungTeilnehmerErgebnis {

  private final VerteilungTeilnehmer teilnehmer;

  private final boolean teilnehmerIsInMehrheitssicherung;

  private final boolean teilnehmerIsInLosverfahren;

  private final boolean entschieden;

  private final long anzahlSitzeAnspruchVorab;

  private final long anzahlSitzeAnspruchInVerteilung;

  private final List<VerteilungQuotient> quotienten;

  public VerteilungTeilnehmerErgebnis(VerteilungTeilnehmer teilnehmer, List<VerteilungQuotient> quotienten) {
    this(teilnehmer, 0L, quotienten);
  }

  public VerteilungTeilnehmerErgebnis(VerteilungTeilnehmer teilnehmer, long anzahlSitzeAnspruch, List<VerteilungQuotient> quotienten) {
    this(teilnehmer, false, false, true, 0L, anzahlSitzeAnspruch, quotienten);
  }

  public VerteilungTeilnehmerErgebnis(VerteilungTeilnehmer teilnehmer, boolean teilnehmerIsInMehrheitssicherung, boolean teilnehmerIsInLosverfahren, boolean entschieden, long anzahlSitzeAnspruchVorab,
      long anzahlSitzeAnspruchInVerteilung, List<VerteilungQuotient> quotienten) {
    super();

    this.teilnehmer = teilnehmer;
    this.teilnehmerIsInMehrheitssicherung = teilnehmerIsInMehrheitssicherung;
    this.teilnehmerIsInLosverfahren = teilnehmerIsInLosverfahren;

    this.entschieden = entschieden;

    this.anzahlSitzeAnspruchVorab = anzahlSitzeAnspruchVorab;
    this.anzahlSitzeAnspruchInVerteilung = anzahlSitzeAnspruchInVerteilung;

    this.quotienten = quotienten;
  }

  public VerteilungTeilnehmer getTeilnehmer() {
    return teilnehmer;
  }

  public boolean isTeilnehmerIsInMehrheitssicherung() {
    return teilnehmerIsInMehrheitssicherung;
  }

  public boolean isTeilnehmerIsInLosverfahren() {
    return teilnehmerIsInLosverfahren;
  }

  public boolean isEntschieden() {
    return entschieden;
  }

  public long getAnzahlStimmen() {
    return getTeilnehmer().getAnzahlStimmen();
  }

  /**
   * @return Anzahl der Sitze, die der Teilnehmer insgesamt bekommen hat
   */
  public long getAnzahlSitzeAnspruch() {
    return getAnzahlSitzeAnspruchVorab() + getAnzahlSitzeAnspruchInVerteilung();
  }

  /**
   * @return Anzahl der Sitze, die der Teilnehmer bereits vorab bekommen hat und die ihm nach der durchgeführten Verteilung hinzugerechnet wurden
   */
  public long getAnzahlSitzeAnspruchVorab() {
    return anzahlSitzeAnspruchVorab;
  }

  /**
   * @return Anzahl der Sitze, die der Teilnehmer in der durchgeführten Verteilung bekommen hat
   */
  public long getAnzahlSitzeAnspruchInVerteilung() {
    return anzahlSitzeAnspruchInVerteilung;
  }

  public List<VerteilungQuotient> getQuotienten() {
    return quotienten;
  }

  public Optional<VerteilungQuotient> getQuotientInLosverfahren() {
    for (VerteilungQuotient verteilungQuotient : getQuotienten()) {
      if (verteilungQuotient.isRelevantInLosverfahren()) {
        return Optional.of(verteilungQuotient);
      }
    }

    return Optional.empty();
  }
}
