
package de.ivu.elect.was.exchange.ergebnis.zusammenstellung;

import java.util.Objects;
import java.util.Optional;

import de.ivu.elect.business.ergebnis.entity.Stimmenart;
import de.ivu.elect.business.kandidatur.entity.KandidaturStimmzettelPersonendaten;
import de.ivu.elect.business.kandidatur.entity.ListenkandidaturStimmzettelPosition;
import de.ivu.elect.business.person.entity.PersonendatenPK;

public class ErgebnisZusammenstellungListenkandidatur extends AbstractErgebnisZusammenstellungKandidatur {

  private final ListenkandidaturStimmzettelPosition stimmzettelPosition;

  private final Optional<PersonendatenPK> identischVerknuepfteDirektkandidaturPK;

  public ErgebnisZusammenstellungListenkandidatur(ErgebnisZusammenstellungGruppe gruppe, ListenkandidaturStimmzettelPosition stimmzettelPosition,
      Optional<PersonendatenPK> identischVerknuepfteDirektkandidaturPK, PersonendatenPK personendatenPK, KandidaturStimmzettelPersonendaten stimmzettelPersonendaten, String titel, String rufname,
      String familienname, String familiennameBestandteil, String stimmenGesamtKennung, Long stimmenGesamt) {
    this(gruppe, stimmzettelPosition, identischVerknuepfteDirektkandidaturPK, personendatenPK, stimmzettelPersonendaten, titel, rufname, familienname, familiennameBestandteil,
        new ErgebnisZusammenstellungEingabe(stimmenGesamtKennung, Stimmenart.LISTENSTIMME, stimmenGesamt));
  }

  private ErgebnisZusammenstellungListenkandidatur(ErgebnisZusammenstellungListenkandidatur template, ErgebnisZusammenstellungEingabe stimmenGesamt) {
    this(template.getGruppe(), template.getStimmzettelPosition(), template.getIdentischVerknuepfteDirektkandidaturPK(), template.getPersonendatenPK(), template.getStimmzettelPersonendaten(),
        template.getTitel(), template.getRufname(), template.getFamilienname(), template.getFamiliennameBestandteil(), stimmenGesamt);
  }

  private ErgebnisZusammenstellungListenkandidatur(ErgebnisZusammenstellungGruppe gruppe, ListenkandidaturStimmzettelPosition stimmzettelPosition,
      Optional<PersonendatenPK> identischVerknuepfteDirektkandidaturPK, PersonendatenPK personendatenPK, KandidaturStimmzettelPersonendaten stimmzettelPersonendaten, String titel, String rufname,
      String familienname, String familiennameBestandteil, ErgebnisZusammenstellungEingabe stimmenGesamt) {
    super(gruppe, personendatenPK, stimmzettelPersonendaten, titel, rufname, familienname, familiennameBestandteil, stimmenGesamt);

    this.stimmzettelPosition = stimmzettelPosition;

    this.identischVerknuepfteDirektkandidaturPK = identischVerknuepfteDirektkandidaturPK;
  }

  public boolean hasStimmzettelPosition() {
    return getStimmzettelPosition() != null && getStimmzettelPosition().hasPosition();
  }

  public ListenkandidaturStimmzettelPosition getStimmzettelPosition() {
    return stimmzettelPosition;
  }

  public Optional<PersonendatenPK> getIdentischVerknuepfteDirektkandidaturPK() {
    return identischVerknuepfteDirektkandidaturPK;
  }

  public ErgebnisZusammenstellungListenkandidatur add(ErgebnisZusammenstellungListenkandidatur another) {
    return sum(this, another);
  }

  private static ErgebnisZusammenstellungListenkandidatur sum(ErgebnisZusammenstellungListenkandidatur one, ErgebnisZusammenstellungListenkandidatur another) {
    if (!Objects.equals(one.getGruppe(), another.getGruppe())) {
      fail("Versuch Listenkandidaturen verschiedener Gruppen zu kumulieren", one, another);
    }

    if (!Objects.equals(one.getStimmzettelPosition(), another.getStimmzettelPosition())) {
      fail("Versuch Listenkandidaturen verschiedener Stimmzettelpositionen (Listenpositionen) zu kumulieren", one, another);
    }

    if (!Objects.equals(one.getPersonendatenPK(), another.getPersonendatenPK())) {
      fail("Versuch Listenkandidaturen verschiedener Personen zu kumulieren", one, another);
    }

    return new ErgebnisZusammenstellungListenkandidatur(one, one.getStimmenGesamt().add(another.getStimmenGesamt()));
  }

  /*
   * AUTO-GENERATED
   */

  @Override
  public String toString() {
    return "ErgebnisZusammenstellungListenkandidatur [personendatenPK = " + getPersonendatenPK() + ", position = " + getStimmzettelPosition().getPosition() + ", rufname = " + getRufname()
        + ", familienname = " + getFamilienname() + "]";
  }
}
