
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...
   *
   * @see ErgebnisGesamtergebnisTabellarischDocument#parteiStimmenSummeQueueNummer
   */
  @DocumentQueue(value = "ParteiStimmenQueue-GruppeSchluessel", elementClass = String.class)
  public LinkedList<String> parteiStimmenQueueNummer;

  /**
   * A.k.a. Gruppe Kurzname...
   *
   * @see ErgebnisGesamtergebnisTabellarischDocument#parteiStimmenSummeQueueNameGruppe
   */
  @DocumentQueue(value = "ParteiStimmenQueue-GruppeKurzname", elementClass = String.class)
  public LinkedList<String> parteiStimmenQueueNameGruppe;

  /**
   * A.k.a. Wahlvorschlag Kurzname oder Kennwort...
   *
   * @see ErgebnisGesamtergebnisTabellarischDocument#parteiStimmenSummeQueueNameWahlvorschlag
   */
  @DocumentQueue(value = "ParteiStimmenQueue-WahlvorschlagKurznameOderKennwort", elementClass = String.class)
  public LinkedList<String> parteiStimmenQueueNameWahlvorschlag;

  /**
   * A.k.a. Wahlvorschlag Stimmzettelposition...
   *
   * @see ErgebnisGesamtergebnisTabellarischDocument#parteiStimmenSummeQueueStimmzettelPositionWahlvorschlag
   */
  @DocumentQueue(value = "ParteiStimmenQueue-WahlvorschlagStimmzettelPosition", elementClass = Long.class)
  public LinkedList<Long> parteiStimmenQueueStimmzettelPositionWahlvorschlag;

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

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

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

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

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

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

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

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

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

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

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

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

  /**
   * @see ErgebnisGesamtergebnisTabellarischDocument#parteiStimmenSummeQueueNameListe
   */
  @DocumentQueue(value = "ParteiStimmenQueue-ZweitstimmenListeKurznameOderKennwort", 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.parteiStimmenQueueAnzahlErststimmen = new LinkedList<>();
    this.parteiStimmenQueueNameDirektkandidat = new LinkedList<>();

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

    this.parteiStimmenQueueKennungZweitstimmen = new LinkedList<>();
    this.parteiStimmenQueueAnzahlZweitstimmen = 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.parteiStimmenQueueAnzahlErststimmen = new LinkedList<>(parteiStimmenQueueAnzahlErststimmen);
    target.parteiStimmenQueueNameDirektkandidat = new LinkedList<>(parteiStimmenQueueNameDirektkandidat);

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

    target.parteiStimmenQueueKennungZweitstimmen = new LinkedList<>(parteiStimmenQueueKennungZweitstimmen);
    target.parteiStimmenQueueAnzahlZweitstimmen = new LinkedList<>(parteiStimmenQueueAnzahlZweitstimmen);
    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
        + ", stimmzettelGesamt=" + stimmzettelGesamt + ", ergebnisart=" + ergebnisart + ", wahlbezirk=" + wahlbezirk + "]";
  }
}
