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

import javax.annotation.Nullable;

import de.ivu.elect.business.wahlvorschlag.entity.WahlvorschlagStimmzettelPosition;
import de.ivu.elect.util.TriFunction;

public class ListenkandidaturStimmzettelPositionFormatter implements ListenkandidaturStimmzettelPositionFormatterKonfiguration {

  public static final ListenkandidaturStimmzettelPositionFormatter EMPTY = new ListenkandidaturStimmzettelPositionFormatter(
      (formatterKonfiguration, listeStimmzettelPosition, position) -> "",
      (formatterKonfiguration, listeStimmzettelPosition, position) -> "", (formatterKonfiguration, listeStimmzettelPosition, position) -> "", false);

  private final TriFunction<ListenkandidaturStimmzettelPositionFormatterKonfiguration, Long, Long, String> positionFormatter;

  private final TriFunction<ListenkandidaturStimmzettelPositionFormatterKonfiguration, Long, Long, String> kennzahlFormatter;

  private final TriFunction<ListenkandidaturStimmzettelPositionFormatterKonfiguration, Long, Long, String> kennzahlAufStimmzettelFormatter;

  private final boolean waehlerBenannteListenkandidaturenErfassbar;

  public ListenkandidaturStimmzettelPositionFormatter(
      TriFunction<ListenkandidaturStimmzettelPositionFormatterKonfiguration, Long, Long, String> positionFormatter,
      TriFunction<ListenkandidaturStimmzettelPositionFormatterKonfiguration, Long, Long, String> kennzahlFormatter,
      TriFunction<ListenkandidaturStimmzettelPositionFormatterKonfiguration, Long, Long, String> kennzahlAufStimmzettelFormatter,
      boolean waehlerBenannteListenkandidaturenErfassbar) {
    super();

    this.positionFormatter = positionFormatter;
    this.kennzahlFormatter = kennzahlFormatter;
    this.kennzahlAufStimmzettelFormatter = kennzahlAufStimmzettelFormatter;

    this.waehlerBenannteListenkandidaturenErfassbar = waehlerBenannteListenkandidaturenErfassbar;
  }

  public String formatPosition(@Nullable WahlvorschlagStimmzettelPosition listeStimmzettelPosition, Long position) {
    Long listePosition = null;

    if (listeStimmzettelPosition != null) {
      listePosition = listeStimmzettelPosition.getPosition();
    }

    return positionFormatter.apply(this, listePosition, position);
  }

  /**
   * @return Die formatierte Kennzahl der Listenkandidatur, bspw. bei der BY-LTW "102" für die Listenkandidatur mit der Position 2 auf der Liste mit der Position 1.
   */
  public String formatKennzahl(@Nullable WahlvorschlagStimmzettelPosition listeStimmzettelPosition, Long position) {
    Long listePosition = null;

    if (listeStimmzettelPosition != null) {
      listePosition = listeStimmzettelPosition.getPosition();
    }

    return kennzahlFormatter.apply(this, listePosition, position);
  }

  public String formatKennzahlAufStimmzettel(@Nullable WahlvorschlagStimmzettelPosition listeStimmzettelPosition, Long position) {
    Long listePosition = null;

    if (listeStimmzettelPosition != null) {
      listePosition = listeStimmzettelPosition.getPosition();
    }

    return kennzahlAufStimmzettelFormatter.apply(this, listePosition, position);
  }

  @Override
  public boolean isWaehlerBenannteListenkandidaturenErfassbar() {
    return waehlerBenannteListenkandidaturenErfassbar;
  }
}
