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

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 AbstractErgebnisGesamtergebnisTabellarischDocumentZeile extends AbstractErgebnisTabellarischDocumentZeile {

  private static final long serialVersionUID = 1L;

  /**
   * A.k.a. Gruppe Schlüssel... (für ALLE Stimmzettelpositionen)
   *
   * @see ErgebnisGesamtergebnisTabellarischDocument#parteiStimmenSummeQueueNummer
   *
   * @deprecated Direkt-/Listenstimmen ggf. mit Lücken in den Stimmzettelposition!!!
   */
  @Deprecated
  @DocumentQueue(value = "ParteiStimmenQueue-GruppeSchluesselLegacy", elementClass = String.class)
  public LinkedList<String> parteiStimmenQueueNummer;

  /**
   * A.k.a. Gruppe Kurzname... (für ALLE Stimmzettelpositionen)
   *
   * @see ErgebnisGesamtergebnisTabellarischDocument#parteiStimmenSummeQueueNameGruppe
   *
   * @deprecated ELECT-14679, Direkt-/Listenstimmen ggf. mit Lücken in den Stimmzettelposition!!!
   * @see AbstractErgebnisGesamtergebnisTabellarischDocumentZeile#parteiStimmenQueueNameGruppeErststimmen
   * @see AbstractErgebnisGesamtergebnisTabellarischDocumentZeile#parteiStimmenQueueNameGruppeZweitstimmen
   */
  @Deprecated
  @DocumentQueue(value = "ParteiStimmenQueue-GruppeKurznameLegacy", elementClass = String.class)
  public LinkedList<String> parteiStimmenQueueNameGruppe;

  /**
   * A.k.a. Wahlvorschlag Kurzname oder Kennwort... (für ALLE Stimmzettelpositionen)
   *
   * @see ErgebnisGesamtergebnisTabellarischDocument#parteiStimmenSummeQueueNameWahlvorschlag
   *
   * @deprecated ELECT-14679, Direkt-/Listenstimmen ggf. mit Lücken in den Stimmzettelposition!!!
   * @see AbstractErgebnisGesamtergebnisTabellarischDocumentZeile#parteiStimmenQueueNameDirektkandidat
   * @see AbstractErgebnisGesamtergebnisTabellarischDocumentZeile#parteiStimmenQueueNameDirektkandidatVollstaendig
   * @see AbstractErgebnisGesamtergebnisTabellarischDocumentZeile#parteiStimmenQueueNameListe
   */
  @Deprecated
  @DocumentQueue(value = "ParteiStimmenQueue-WahlvorschlagKurznameOderKennwortLegacy", elementClass = String.class)
  public LinkedList<String> parteiStimmenQueueNameWahlvorschlag;

  /**
   * A.k.a. Wahlvorschlag Stimmzettelposition... (für ALLE Stimmzettelpositionen)
   *
   * @see ErgebnisGesamtergebnisTabellarischDocument#parteiStimmenSummeQueueStimmzettelPositionWahlvorschlag
   *
   * @deprecated Direkt-/Listenstimmen ggf. mit Lücken in den Stimmzettelposition!!!
   */
  @Deprecated
  @DocumentQueue(value = "ParteiStimmenQueue-WahlvorschlagStimmzettelPositionLegacy", elementClass = Long.class)
  public LinkedList<Long> parteiStimmenQueueStimmzettelPositionWahlvorschlag;

  /**
   * D1, D2, ... (für ALLE Stimmzettelpositionen)
   *
   * @see ErgebnisGesamtergebnisTabellarischDocument#parteiStimmenSummeQueueKennung
   *
   * @deprecated ELECT-12398, Direkt-/Listenstimmen ggf. mit Lücken in den Stimmzettelposition!!!
   * @see AbstractErgebnisGesamtergebnisTabellarischDocumentZeile#parteiStimmenQueueKennungErststimmen
   * @see AbstractErgebnisGesamtergebnisTabellarischDocumentZeile#parteiStimmenQueueKennungZweitstimmen
   */
  @Deprecated
  @DocumentQueue(value = "ParteiStimmenQueue-WahlvorschlagKennungLegacy", elementClass = String.class)
  public LinkedList<String> parteiStimmenQueueKennung;

  @DocumentSimpleField("Direktstimmen-Gueltig")
  public Long erststimmenGueltig;

  @DocumentSimpleField("Direktstimmen-Ungueltig")
  public Long erststimmenUngueltig;

  @DocumentSimpleField("Direktstimmen-Gesamt")
  public Long erststimmenGesamt;

  /**
   * D01, D02, D04, ... (nur für existente Stimmzettelpositionen)
   *
   * @see ErgebnisGesamtergebnisTabellarischDocument#parteiStimmenSummeQueueKennungErststimmen
   */
  @DocumentQueue(value = "ParteiStimmenQueue-DirektstimmenKennung", elementClass = String.class)
  public LinkedList<String> parteiStimmenQueueKennungErststimmen;

  /**
   * 01, 02, 04, ... (nur für existente Stimmzettelpositionen)
   *
   * @see ErgebnisGesamtergebnisTabellarischDocument#parteiStimmenSummeQueueKennungPositionErststimmen
   */
  @DocumentQueue(value = "ParteiStimmenQueue-DirektstimmenKennungPosition", elementClass = String.class)
  public LinkedList<String> parteiStimmenQueueKennungPositionErststimmen;

  /**
   * @see ErgebnisGesamtergebnisTabellarischDocument#parteiStimmenSummeQueueAnzahlErststimmen
   */
  @DocumentQueue(value = "ParteiStimmenQueue-DirektstimmenAnzahl", elementClass = Long.class)
  public LinkedList<Long> parteiStimmenQueueAnzahlErststimmen;

  /**
   * ELECT-14679
   *
   * @see ErgebnisGesamtergebnisTabellarischDocument#parteiStimmenSummeQueueNameGruppeErststimmen
   */
  @DocumentQueue(value = "ParteiStimmenQueue-DirektstimmenGruppeKurzname", elementClass = String.class)
  public LinkedList<String> parteiStimmenQueueNameGruppeErststimmen;

  /**
   * @see ErgebnisGesamtergebnisTabellarischDocument#parteiStimmenSummeQueueNameDirektkandidat
   */
  @DocumentQueue(value = "ParteiStimmenQueue-DirektstimmenDirektkandidatFamilienname", elementClass = String.class)
  public LinkedList<String> parteiStimmenQueueNameDirektkandidat;

  /**
   * @see ErgebnisGesamtergebnisTabellarischDocument#parteiStimmenSummeQueueNameDirektkandidatVollstaendig
   */
  @DocumentQueue(value = "ParteiStimmenQueue-DirektstimmenDirektkandidatFamiliennameInklusiveTitelFamiliennameBestandteil", elementClass = String.class)
  public LinkedList<String> parteiStimmenQueueNameDirektkandidatVollstaendig; // ELECT-14337

  /**
   * @see ErgebnisGesamtergebnisTabellarischDocument#parteiStimmenSummeQueueNameDirektkandidatVorname
   */
  @DocumentQueue(value = "ParteiStimmenQueue-DirektstimmenDirektkandidatVorname", elementClass = String.class)
  public LinkedList<String> parteiStimmenQueueNameDirektkandidatVorname; // ELECT-14337

  @DocumentSimpleField("Listenstimmen-Gueltig")
  public Long zweitstimmenGueltig;

  @DocumentSimpleField("Listenstimmen-Ungueltig")
  public Long zweitstimmenUngueltig;

  @DocumentSimpleField("Listenstimmen-Gesamt")
  public Long zweitstimmenGesamt;

  /**
   * F01, F02, F04, ... (nur für existente Stimmzettelpositionen)
   *
   * @see ErgebnisGesamtergebnisTabellarischDocument#parteiStimmenSummeQueueKennungZweitstimmen
   */
  @DocumentQueue(value = "ParteiStimmenQueue-ListenstimmenKennung", elementClass = String.class)
  public LinkedList<String> parteiStimmenQueueKennungZweitstimmen;

  /**
   * 01, 02, 04, ... (nur für existente Stimmzettelpositionen)
   *
   * @see ErgebnisGesamtergebnisTabellarischDocument#parteiStimmenSummeQueueKennungPositionZweitstimmen
   */
  @DocumentQueue(value = "ParteiStimmenQueue-ListenstimmenKennungPosition", elementClass = String.class)
  public LinkedList<String> parteiStimmenQueueKennungPositionZweitstimmen;

  /**
   * @see ErgebnisGesamtergebnisTabellarischDocument#parteiStimmenSummeQueueAnzahlZweitstimmen
   */
  @DocumentQueue(value = "ParteiStimmenQueue-ListenstimmenAnzahl", elementClass = Long.class)
  public LinkedList<Long> parteiStimmenQueueAnzahlZweitstimmen;

  /**
   * @see ErgebnisGesamtergebnisTabellarischDocument#parteiStimmenSummeQueueAnzahlStimmzettelNurEinzelnerWahlvorschlagUnveraendert
   */
  @DocumentQueue(value = "ParteiStimmenQueue-StimmzettelNurEinzelnerWahlvorschlagUnveraendertAnzahl", elementClass = Long.class)
  public LinkedList<Long> parteiStimmenQueueAnzahlStimmzettelNurEinzelnerWahlvorschlagUnveraendert;

  /**
   * @see ErgebnisGesamtergebnisTabellarischDocument#parteiStimmenSummeQueueAnzahlStimmzettelNurEinzelnerWahlvorschlagVeraendert
   */
  @DocumentQueue(value = "ParteiStimmenQueue-StimmzettelNurEinzelnerWahlvorschlagVeraendertAnzahl", elementClass = Long.class)
  public LinkedList<Long> parteiStimmenQueueAnzahlStimmzettelNurEinzelnerWahlvorschlagVeraendert;

  /**
   * @see ErgebnisGesamtergebnisTabellarischDocument#parteiStimmenSummeQueueAnzahlStimmzettelNurEinzelnerWahlvorschlagPanaschiert
   */
  @DocumentQueue(value = "ParteiStimmenQueue-StimmzettelNurEinzelnerWahlvorschlagPanaschiertAnzahl", elementClass = Long.class)
  public LinkedList<Long> parteiStimmenQueueAnzahlStimmzettelNurEinzelnerWahlvorschlagPanaschiert;

  /**
   * ELECT-14679
   *
   * @see ErgebnisGesamtergebnisTabellarischDocument#parteiStimmenSummeQueueNameGruppeZweitstimmen
   */
  @DocumentQueue(value = "ParteiStimmenQueue-ListenstimmenGruppeKurzname", elementClass = String.class)
  public LinkedList<String> parteiStimmenQueueNameGruppeZweitstimmen;

  /**
   * @see ErgebnisGesamtergebnisTabellarischDocument#parteiStimmenSummeQueueNameListe
   */
  @DocumentQueue(value = "ParteiStimmenQueue-ListenstimmenListeKurznameOderKennwort", elementClass = String.class)
  public LinkedList<String> parteiStimmenQueueNameListe;

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

    this.parteiStimmenQueueNummer = new LinkedList<>();
    this.parteiStimmenQueueNameGruppe = new LinkedList<>();
    this.parteiStimmenQueueNameWahlvorschlag = new LinkedList<>();
    this.parteiStimmenQueueStimmzettelPositionWahlvorschlag = new LinkedList<>();
    this.parteiStimmenQueueKennung = new LinkedList<>();

    this.erststimmenGueltig = 0L;
    this.erststimmenUngueltig = 0L;
    this.erststimmenGesamt = 0L;

    this.parteiStimmenQueueKennungErststimmen = new LinkedList<>();
    this.parteiStimmenQueueKennungPositionErststimmen = new LinkedList<>();
    this.parteiStimmenQueueAnzahlErststimmen = new LinkedList<>();
    this.parteiStimmenQueueNameGruppeErststimmen = new LinkedList<>();
    this.parteiStimmenQueueNameDirektkandidat = new LinkedList<>();
    this.parteiStimmenQueueNameDirektkandidatVollstaendig = new LinkedList<>();
    this.parteiStimmenQueueNameDirektkandidatVorname = new LinkedList<>();

    this.zweitstimmenGueltig = 0L;
    this.zweitstimmenUngueltig = 0L;
    this.zweitstimmenGesamt = 0L;

    this.parteiStimmenQueueKennungZweitstimmen = new LinkedList<>();
    this.parteiStimmenQueueKennungPositionZweitstimmen = new LinkedList<>();
    this.parteiStimmenQueueAnzahlZweitstimmen = new LinkedList<>();
    this.parteiStimmenQueueAnzahlStimmzettelNurEinzelnerWahlvorschlagUnveraendert = new LinkedList<>();
    this.parteiStimmenQueueAnzahlStimmzettelNurEinzelnerWahlvorschlagVeraendert = new LinkedList<>();
    this.parteiStimmenQueueAnzahlStimmzettelNurEinzelnerWahlvorschlagPanaschiert = new LinkedList<>();
    this.parteiStimmenQueueNameGruppeZweitstimmen = new LinkedList<>();
    this.parteiStimmenQueueNameListe = new LinkedList<>();
  }

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

    target.parteiStimmenQueueNummer = new LinkedList<>(parteiStimmenQueueNummer);
    target.parteiStimmenQueueNameGruppe = new LinkedList<>(parteiStimmenQueueNameGruppe);
    target.parteiStimmenQueueNameWahlvorschlag = new LinkedList<>(parteiStimmenQueueNameWahlvorschlag);
    target.parteiStimmenQueueStimmzettelPositionWahlvorschlag = new LinkedList<>(parteiStimmenQueueStimmzettelPositionWahlvorschlag);
    target.parteiStimmenQueueKennung = new LinkedList<>(parteiStimmenQueueKennung);

    target.erststimmenGueltig = erststimmenGueltig;
    target.erststimmenUngueltig = erststimmenUngueltig;
    target.erststimmenGesamt = erststimmenGesamt;

    target.parteiStimmenQueueKennungErststimmen = new LinkedList<>(parteiStimmenQueueKennungErststimmen);
    target.parteiStimmenQueueKennungPositionErststimmen = new LinkedList<>(parteiStimmenQueueKennungPositionErststimmen);
    target.parteiStimmenQueueAnzahlErststimmen = new LinkedList<>(parteiStimmenQueueAnzahlErststimmen);
    target.parteiStimmenQueueNameGruppeErststimmen = new LinkedList<>(parteiStimmenQueueNameGruppeErststimmen);
    target.parteiStimmenQueueNameDirektkandidat = new LinkedList<>(parteiStimmenQueueNameDirektkandidat);
    target.parteiStimmenQueueNameDirektkandidatVollstaendig = new LinkedList<>(parteiStimmenQueueNameDirektkandidatVollstaendig);
    target.parteiStimmenQueueNameDirektkandidatVorname = new LinkedList<>(parteiStimmenQueueNameDirektkandidatVorname);

    target.zweitstimmenGueltig = zweitstimmenGueltig;
    target.zweitstimmenUngueltig = zweitstimmenUngueltig;
    target.zweitstimmenGesamt = zweitstimmenGesamt;

    target.parteiStimmenQueueKennungZweitstimmen = new LinkedList<>(parteiStimmenQueueKennungZweitstimmen);
    target.parteiStimmenQueueKennungPositionZweitstimmen = new LinkedList<>(parteiStimmenQueueKennungPositionZweitstimmen);
    target.parteiStimmenQueueAnzahlZweitstimmen = new LinkedList<>(parteiStimmenQueueAnzahlZweitstimmen);
    target.parteiStimmenQueueAnzahlStimmzettelNurEinzelnerWahlvorschlagUnveraendert = new LinkedList<>(parteiStimmenQueueAnzahlStimmzettelNurEinzelnerWahlvorschlagUnveraendert);
    target.parteiStimmenQueueAnzahlStimmzettelNurEinzelnerWahlvorschlagVeraendert = new LinkedList<>(parteiStimmenQueueAnzahlStimmzettelNurEinzelnerWahlvorschlagVeraendert);
    target.parteiStimmenQueueAnzahlStimmzettelNurEinzelnerWahlvorschlagPanaschiert = new LinkedList<>(parteiStimmenQueueAnzahlStimmzettelNurEinzelnerWahlvorschlagPanaschiert);
    target.parteiStimmenQueueNameGruppeZweitstimmen = new LinkedList<>(parteiStimmenQueueNameGruppeZweitstimmen);
    target.parteiStimmenQueueNameListe = new LinkedList<>(parteiStimmenQueueNameListe);

    return target;
  }

  @Override
  public String toString() {
    return "AbstractErgebnisGesamtergebnisTabellarischDocumentZeile [datenArt=" + datenArt + ", datenArtZwischensumme=" + datenArtZwischensumme + ", nummer=" + nummer + ", name=" + name
        + ", wahlberechtigteOhneWahlschein=" + wahlberechtigteOhneWahlschein + ", wahlberechtigteMitWahlschein=" + wahlberechtigteMitWahlschein + ", wahlberechtigteNichtImWaehlerverzeichnis="
        + wahlberechtigteNichtImWaehlerverzeichnis + ", wahlberechtigteGesamt=" + wahlberechtigteGesamt + ", waehlerOhneWahlschein=" + waehlerOhneWahlschein + ", waehlerMitWahlschein="
        + waehlerMitWahlschein + ", waehlerMitWahlscheinAnteilAusUrnenwahl=" + waehlerMitWahlscheinAnteilAusUrnenwahl + ", waehlerMitWahlscheinAnteilAusBriefwahl="
        + waehlerMitWahlscheinAnteilAusBriefwahl + ", waehlerGesamt=" + waehlerGesamt + ", stimmzettelGueltig=" + stimmzettelGueltig + ", stimmzettelUngueltig=" + stimmzettelUngueltig
        + ", stimmzettelUnbestimmt=" + stimmzettelUnbestimmt + ", stimmzettelGesamt=" + stimmzettelGesamt + ", ergebnisart=" + ergebnisart + ", wahlbezirk=" + wahlbezirk + "]";
  }
}
