
package de.ivu.elect.business.kandidatur.entity;

import javax.annotation.Nullable;

import de.ivu.elect.business.stimmzettel.entity.AbstractEntityAufStimmzettelStimmzettelPosition;
import de.ivu.elect.business.wahlvorschlag.entity.WahlvorschlagPK;
import de.ivu.elect.business.wahlvorschlag.entity.WahlvorschlagStimmzettelPosition;

public class ListenkandidaturStimmzettelPosition extends AbstractEntityAufStimmzettelStimmzettelPosition {

  public static final ListenkandidaturStimmzettelPosition EMPTY = new ListenkandidaturStimmzettelPosition(new WahlvorschlagPK(), POSITION_EMPTY, POSITION_EMPTY, POSITION_EMPTY, POSITION_EMPTY,
      POSITION_EMPTY, POSITION_EMPTY, POSITION_EMPTY, POSITION_EMPTY, ListenkandidaturStimmzettelPositionFormatter.EMPTY);

  private final Long anzahlNennungen;

  private final Long berechnetePositionFortlaufend;

  private final Long berechnetePositionNennungenExcluded;

  private final Long berechnetePositionNennungenIncluded;

  private final ListenkandidaturStimmzettelPositionFormatter formatter;

  public ListenkandidaturStimmzettelPosition(Listenkandidatur listenkandidatur, Long berechnetePosition, Long anzahlNennungen, Long berechnetePositionFortlaufend,
      Long berechnetePositionNennungenExcluded, Long berechnetePositionNennungenIncluded, ListenkandidaturStimmzettelPositionFormatter formatter) {
    this(listenkandidatur.getListe().getPk(), listenkandidatur.getEingereichtePosition(), listenkandidatur.getVorgegebenePosition(), listenkandidatur.getRelativePosition(), berechnetePosition,
        anzahlNennungen, berechnetePositionFortlaufend, berechnetePositionNennungenExcluded, berechnetePositionNennungenIncluded, formatter);
  }

  private ListenkandidaturStimmzettelPosition(WahlvorschlagPK listePK, Long eingereichtePosition, Long vorgegebenPosition, Long relativePosition, Long berechnetePosition, Long anzahlNennungen,
      Long berechnetePositionFortlaufend, Long berechnetePositionNennungenExcluded, Long berechnetePositionNennungenIncluded, ListenkandidaturStimmzettelPositionFormatter formatter) {
    super(listePK, eingereichtePosition, vorgegebenPosition, relativePosition, berechnetePosition);

    this.anzahlNennungen = anzahlNennungen;

    this.berechnetePositionFortlaufend = berechnetePositionFortlaufend;

    this.berechnetePositionNennungenExcluded = berechnetePositionNennungenExcluded;
    this.berechnetePositionNennungenIncluded = berechnetePositionNennungenIncluded;

    this.formatter = formatter;
  }

  @Override
  public boolean hasPosition() {
    return super.hasPosition() && !this.equals(EMPTY);
  }

  public Long getAnzahlNennungen() {
    return anzahlNennungen;
  }

  @Nullable
  protected Long getPositionFortlaufend() {
    return berechnetePositionFortlaufend;
  }

  @Nullable
  protected Long getPositionNennungenExcluded() {
    return berechnetePositionNennungenExcluded;
  }

  @Nullable
  protected Long getPositionNennungenIncluded() {
    return berechnetePositionNennungenIncluded;
  }

  public String formatPosition(@Nullable WahlvorschlagStimmzettelPosition listeStimmzettelPosition) {
    return getFormatter().formatPosition(listeStimmzettelPosition, getPosition());
  }

  /**
   * NOTE, dass die WahlvorschlagStimmzettelPosition der Liste (momentan) als Parameter übergeben werden muss und KEIN Teil der ListenkandidaturStimmzettelPosition einer Listenkandidatur sein kann, da
   * die Berechnung der Stimmzettelposition der Liste beinhaltet, dass die WUS-Zulassungsprüfung alle Listenkandidaturen der Liste nach deren Stimmzettelposition ordnet... Henne-Ei-Problem, cf.
   * WusZulassungPruefer#isAnzahlNennungenGeordnet!!!
   */
  public String formatKennzahl(@Nullable WahlvorschlagStimmzettelPosition listeStimmzettelPosition) {
    return getFormatter().formatKennzahl(listeStimmzettelPosition, getPosition());
  }

  public boolean isWaehlerBenannteListenkandidaturenErfassbar() {
    return getFormatter().isWaehlerBenannteListenkandidaturenErfassbar();
  }

  private ListenkandidaturStimmzettelPositionFormatter getFormatter() {
    return formatter;
  }
}
