
package de.ivu.elect.dokumente.ergebnis.kandidatur;

import java.util.LinkedList;

import de.ivu.document.generator.template.annotations.DocumentQueue;
import de.ivu.document.generator.template.annotations.DocumentSimpleField;
import de.ivu.elect.business.gebietsbaum.entity.Wahldurchfuehrungsgebiet;
import de.ivu.elect.business.wahl.entity.WahlartErgebnisart;
import de.ivu.elect.dokumente.ergebnis.AbstractErgebnisTabellarischDocumentZeile;

public abstract class AbstractErgebnisKandidaturenTabellarischDocumentZeile extends AbstractErgebnisTabellarischDocumentZeile {

  private static final long serialVersionUID = 1L;

  @DocumentSimpleField("Wahlvorschlag-Name")
  public String wahlvorschlagName;

  @DocumentSimpleField("Partei-KurzName")
  public String parteiKurzName;

  @DocumentSimpleField("Partei-Nummer")
  public String parteiNummer;

  @DocumentSimpleField("Partei-Nummer-Wahlkreisvorschlag")
  public String parteiNummerWahlkreisvorschlag;

  @DocumentSimpleField("Partei-Direktstimmen-Nummer-Bewerber")
  public String parteiErststimmenNummerBewerber;

  @DocumentSimpleField("Partei-Direktstimmen-Name-Bewerber")
  public String parteiErststimmenNameBewerber;

  @DocumentSimpleField("Partei-Direktstimmen-Vorname-Bewerber")
  public String parteiErststimmenVornameBewerber;

  @DocumentSimpleField("Partei-Direktstimmen-Anzahl")
  public Long parteiErststimmenAnzahl;

  @DocumentSimpleField("Partei-Listenstimmen-Anzahl")
  public Long parteiZweitstimmenAnzahl;

  @DocumentSimpleField("Partei-Listenstimmen-Nur-Liste-Name")
  public String parteiZweitstimmenNurListeName;

  @DocumentSimpleField("Partei-Listenstimmen-Nur-Liste-Nummer")
  public String parteiZweitstimmenNurListeNummer;

  @DocumentSimpleField("Partei-Listenstimmen-Nur-Liste-Nummer-Mit-Partei")
  public String parteiZweitstimmenNurListeNummerMitPartei;

  @DocumentSimpleField("Partei-Listenstimmen-Nur-Liste-Stimmen")
  public Long parteiZweitstimmenNurListeAnzahl;

  @DocumentSimpleField("Partei-Listenstimmen-Nur-Listenkandidaturen-Name")
  public String parteiZweitstimmenNurListenkandidaturenName;

  @DocumentSimpleField("Partei-Listenstimmen-Nur-Listenkandidaturen-Nummer")
  public String parteiZweitstimmenNurListenkandidaturenNummer;

  @DocumentSimpleField("Partei-Listenstimmen-Nur-Listenkandidaturen-Nummer-Mit-Partei")
  public String parteiZweitstimmenNurListenkandidaturenNummerMitPartei;

  @DocumentSimpleField("Partei-Listenstimmen-Nur-Listenkandidaturen-Stimmen")
  public Long parteiZweitstimmenNurListenkandidaturenAnzahl;

  @DocumentSimpleField("Partei-Stimmzettel-Nur-Einzelner-Wahlvorschlag-Unveraendert")
  public Long parteiStimmzettelNurEinzelnerWahlvorschlagUnveraendertAnzahl;

  @DocumentSimpleField("Partei-Stimmzettel-Nur-Einzelner-Wahlvorschlag-Veraendert")
  public Long parteiStimmzettelNurEinzelnerWahlvorschlagVeraendertAnzahl;

  @DocumentSimpleField("Partei-Stimmzettel-Nur-Einzelner-Wahlvorschlag-Panaschiert")
  public Long parteiStimmzettelNurEinzelnerWahlvorschlagPanaschiertAnzahl;

  @DocumentQueue(value = "ListenkandidatStimmenQueue-Familienname", elementClass = String.class)
  public final LinkedList<String> listenkandidatStimmenQueueName;

  @DocumentQueue(value = "ListenkandidatStimmenQueue-FamiliennameInklusiveTitelFamiliennameBestandteil", elementClass = String.class)
  public final LinkedList<String> listenkandidatStimmenQueueNameVollstaendig; // ELECT-14337

  @DocumentQueue(value = "ListenkandidatStimmenQueue-Vorname", elementClass = String.class)
  public final LinkedList<String> listenkandidatStimmenQueueVorname; // ELECT-14337

  @DocumentQueue(value = "ListenkandidatStimmenQueue-Nummer", elementClass = String.class)
  public final LinkedList<String> listenkandidatStimmenQueueNummer;

  @DocumentQueue(value = "ListenkandidatStimmenQueue-Nummer-Mit-Partei", elementClass = String.class)
  public final LinkedList<String> listenkandidatStimmenQueueNummerMitPartei;

  @DocumentQueue(value = "ListenkandidatStimmenQueue-Stimmen", elementClass = Long.class)
  public final LinkedList<Long> listenkandidatStimmenQueueAnzahlStimmen;

  protected AbstractErgebnisKandidaturenTabellarischDocumentZeile(WahlartErgebnisart ergebnisart, Wahldurchfuehrungsgebiet wahldurchfuehrungsgebiet) {
    super(ergebnisart, wahldurchfuehrungsgebiet);

    this.wahlvorschlagName = "";

    this.parteiKurzName = "";
    this.parteiNummer = "";

    this.parteiNummerWahlkreisvorschlag = "";

    this.parteiErststimmenNummerBewerber = "";
    this.parteiErststimmenNameBewerber = "";
    this.parteiErststimmenVornameBewerber = "";
    this.parteiErststimmenAnzahl = 0L;

    this.parteiZweitstimmenAnzahl = 0L;

    this.parteiZweitstimmenNurListeName = "";
    this.parteiZweitstimmenNurListeNummer = "";
    this.parteiZweitstimmenNurListeNummerMitPartei = "";
    this.parteiZweitstimmenNurListeAnzahl = 0L;

    this.parteiZweitstimmenNurListenkandidaturenName = "";
    this.parteiZweitstimmenNurListenkandidaturenNummer = "";
    this.parteiZweitstimmenNurListenkandidaturenNummerMitPartei = "";
    this.parteiZweitstimmenNurListenkandidaturenAnzahl = 0L;

    this.parteiStimmzettelNurEinzelnerWahlvorschlagUnveraendertAnzahl = 0L;
    this.parteiStimmzettelNurEinzelnerWahlvorschlagVeraendertAnzahl = 0L;
    this.parteiStimmzettelNurEinzelnerWahlvorschlagPanaschiertAnzahl = 0L;

    this.listenkandidatStimmenQueueName = new LinkedList<>();
    this.listenkandidatStimmenQueueNameVollstaendig = new LinkedList<>();
    this.listenkandidatStimmenQueueVorname = new LinkedList<>();
    this.listenkandidatStimmenQueueNummer = new LinkedList<>();
    this.listenkandidatStimmenQueueNummerMitPartei = new LinkedList<>();
    this.listenkandidatStimmenQueueAnzahlStimmen = new LinkedList<>();
  }

  protected <T extends AbstractErgebnisKandidaturenTabellarischDocumentZeile> T copyTo(T target) {
    super.copyTo(target);

    target.wahlvorschlagName = wahlvorschlagName;

    target.parteiKurzName = parteiKurzName;
    target.parteiNummer = parteiNummer;

    target.parteiNummerWahlkreisvorschlag = parteiNummerWahlkreisvorschlag;

    target.parteiErststimmenNummerBewerber = parteiErststimmenNummerBewerber;
    target.parteiErststimmenNameBewerber = parteiErststimmenNameBewerber;
    target.parteiErststimmenVornameBewerber = parteiErststimmenVornameBewerber;
    target.parteiErststimmenAnzahl = parteiErststimmenAnzahl;

    target.parteiZweitstimmenAnzahl = parteiZweitstimmenAnzahl;

    target.parteiZweitstimmenNurListeName = parteiZweitstimmenNurListeName;
    target.parteiZweitstimmenNurListeNummer = parteiZweitstimmenNurListeNummer;
    target.parteiZweitstimmenNurListeNummerMitPartei = parteiZweitstimmenNurListeNummerMitPartei;
    target.parteiZweitstimmenNurListeAnzahl = parteiZweitstimmenNurListeAnzahl;

    target.parteiZweitstimmenNurListenkandidaturenName = parteiZweitstimmenNurListenkandidaturenName;
    target.parteiZweitstimmenNurListenkandidaturenNummer = parteiZweitstimmenNurListenkandidaturenNummer;
    target.parteiZweitstimmenNurListenkandidaturenNummerMitPartei = parteiZweitstimmenNurListenkandidaturenNummerMitPartei;
    target.parteiZweitstimmenNurListenkandidaturenAnzahl = parteiZweitstimmenNurListenkandidaturenAnzahl;

    target.parteiStimmzettelNurEinzelnerWahlvorschlagUnveraendertAnzahl = parteiStimmzettelNurEinzelnerWahlvorschlagUnveraendertAnzahl;
    target.parteiStimmzettelNurEinzelnerWahlvorschlagVeraendertAnzahl = parteiStimmzettelNurEinzelnerWahlvorschlagVeraendertAnzahl;
    target.parteiStimmzettelNurEinzelnerWahlvorschlagPanaschiertAnzahl = parteiStimmzettelNurEinzelnerWahlvorschlagPanaschiertAnzahl;

    target.listenkandidatStimmenQueueName.addAll(listenkandidatStimmenQueueName);
    target.listenkandidatStimmenQueueNameVollstaendig.addAll(listenkandidatStimmenQueueNameVollstaendig);
    target.listenkandidatStimmenQueueVorname.addAll(listenkandidatStimmenQueueVorname);
    target.listenkandidatStimmenQueueNummer.addAll(listenkandidatStimmenQueueNummer);
    target.listenkandidatStimmenQueueNummerMitPartei.addAll(listenkandidatStimmenQueueNummerMitPartei);
    target.listenkandidatStimmenQueueAnzahlStimmen.addAll(listenkandidatStimmenQueueAnzahlStimmen);

    return target;
  }
}
