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

import de.ivu.elect.business.ergebnis.control.ErgebnisDaten;
import de.ivu.elect.business.ergebnis.control.ErgebnisDatenGueltige;
import de.ivu.elect.business.ergebnis.entity.Stimmabgabeart;
import de.ivu.elect.business.gebietsbaum.entity.Wahldurchfuehrungsgebiet;
import de.ivu.elect.business.gruppe.entity.PolitischeGruppe;
import de.ivu.elect.business.gruppeimgebiet.entity.GruppeImGebiet;
import de.ivu.elect.business.internet.control.GebietUndStimmabgabeart;
import de.ivu.elect.business.kandidatur.entity.Direktkandidatur;
import de.ivu.elect.business.stimmzettel.entity.EntityAufStimmzettelDaten;
import de.ivu.elect.business.wahl.entity.WahlartErgebnisart;
import de.ivu.elect.business.wahlvorschlag.entity.Liste;
import de.ivu.elect.business.wahlvorschlag.entity.Wahlvorschlag;
import de.ivu.elect.business.wahlvorschlag.entity.WahlvorschlagStimmzettelPosition;
import de.ivu.elect.dokumente.ergebnis.AbstractErgebnisTabellarischDocumentZeileCreator;

public class ErgebnisGesamtergebnisTabellarischDocumentZeileCreator extends AbstractErgebnisTabellarischDocumentZeileCreator<ErgebnisGesamtergebnisTabellarischDocumentZeile> {

  public ErgebnisGesamtergebnisTabellarischDocumentZeileCreator() {
    super();
  }

  @Override
  protected ErgebnisGesamtergebnisTabellarischDocumentZeile createZeile(WahlartErgebnisart ergebnisart, Wahldurchfuehrungsgebiet wahldurchfuehrungsgebiet) {
    return new ErgebnisGesamtergebnisTabellarischDocumentZeile(ergebnisart, wahldurchfuehrungsgebiet);
  }

  @Override
  protected void fillInErgebnisDatenGueltige(ErgebnisGesamtergebnisTabellarischDocumentZeile zeile, ErgebnisDaten ergebnisDaten, Wahldurchfuehrungsgebiet wahldurchfuehrungsgebiet,
      Stimmabgabeart stimmabgabeart) {
    super.fillInErgebnisDatenGueltige(zeile, ergebnisDaten, wahldurchfuehrungsgebiet, stimmabgabeart);

    GebietUndStimmabgabeart gebietUndStimmabgabeart = new GebietUndStimmabgabeart(wahldurchfuehrungsgebiet, stimmabgabeart);

    ErgebnisDatenGueltige ergebnisDatenGueltige = ergebnisDaten.getErgebnisDatenGueltige();

    zeile.erststimmenGueltig = ergebnisDatenGueltige.getErststimmenAktuellGueltig(gebietUndStimmabgabeart);
    zeile.erststimmenUngueltig = ergebnisDatenGueltige.getErststimmenAktuellUngueltig(gebietUndStimmabgabeart);
    zeile.erststimmenGesamt = ergebnisDatenGueltige.getErststimmenAktuellGesamt(gebietUndStimmabgabeart);

    zeile.zweitstimmenGueltig = ergebnisDatenGueltige.getZweitstimmenAktuellGueltig(gebietUndStimmabgabeart);
    zeile.zweitstimmenUngueltig = ergebnisDatenGueltige.getZweitstimmenAktuellUngueltig(gebietUndStimmabgabeart);
    zeile.zweitstimmenGesamt = ergebnisDatenGueltige.getZweitstimmenAktuellGesamt(gebietUndStimmabgabeart);
  }

  @Override
  protected void fillInErgebnisDatenStimmen(ErgebnisGesamtergebnisTabellarischDocumentZeile zeile, ErgebnisDaten ergebnisDaten, Wahldurchfuehrungsgebiet wahldurchfuehrungsgebiet,
      Stimmabgabeart stimmabgabeart) {
    EntityAufStimmzettelDaten entityAufStimmzettelDaten = ergebnisDaten.getEntityAufStimmzettelDaten();

    GebietUndStimmabgabeart gebietUndStimmabgabeart = new GebietUndStimmabgabeart(wahldurchfuehrungsgebiet, stimmabgabeart);

    for (PolitischeGruppe politischeGruppe : collectPolitischeGruppenRelevantSorted(ergebnisDaten, wahldurchfuehrungsgebiet)) {
      GruppeImGebiet gruppeImGebiet = ergebnisDaten.getGruppeImGebiet(politischeGruppe, wahldurchfuehrungsgebiet);
      Wahlvorschlag wahlvorschlag = gruppeImGebiet.getErstenWahlvorschlagAbgeleitet(entityAufStimmzettelDaten);

      if (wahlvorschlag != null) {
        WahlvorschlagStimmzettelPosition wahlvorschlagStimmzettelPosition = wahlvorschlag.getStimmzettelPosition(wahldurchfuehrungsgebiet, entityAufStimmzettelDaten);

        zeile.parteiStimmenQueueNummer.add(politischeGruppe.getSchluessel());
        zeile.parteiStimmenQueueNameGruppe.add(politischeGruppe.getKurznameAufGebiet(wahldurchfuehrungsgebiet));

        zeile.parteiStimmenQueueNameWahlvorschlag.add(wahlvorschlag.getKurznameOderKennwort());
        zeile.parteiStimmenQueueStimmzettelPositionWahlvorschlag.add(wahlvorschlagStimmzettelPosition.getPosition());
        zeile.parteiStimmenQueueKennung.add("D" + wahlvorschlagStimmzettelPosition.formatPosition()); // LEGACY!!!

        Long anzahlDirektstimmenIfWahlvorschlagExists = ergebnisDaten.getErststimmenAktuell(politischeGruppe, gebietUndStimmabgabeart);

        if (anzahlDirektstimmenIfWahlvorschlagExists != null) { // ELECT-12398
          Direktkandidatur direktkandidatur = extractDirektkandidatur(wahldurchfuehrungsgebiet, ergebnisDaten, politischeGruppe, wahlvorschlag);

          if (direktkandidatur != null) {
            zeile.parteiStimmenQueueKennungErststimmen.add("D" + wahlvorschlagStimmzettelPosition.formatPosition());
            zeile.parteiStimmenQueueAnzahlErststimmen.add(anzahlDirektstimmenIfWahlvorschlagExists);
            zeile.parteiStimmenQueueNameDirektkandidat.add(direktkandidatur.getFamilienname());
          }
        }

        Long anzahlListenstimmenIfWahlvorschlagExists = ergebnisDaten.getZweitstimmenAktuell(politischeGruppe, gebietUndStimmabgabeart);

        if (anzahlListenstimmenIfWahlvorschlagExists != null) { // ELECT-12398
          Liste liste = extractListe(wahldurchfuehrungsgebiet, ergebnisDaten, politischeGruppe, wahlvorschlag);

          if (liste != null) {
            zeile.parteiStimmenQueueKennungZweitstimmen.add("F" + wahlvorschlagStimmzettelPosition.formatPosition());
            zeile.parteiStimmenQueueAnzahlZweitstimmen.add(anzahlListenstimmenIfWahlvorschlagExists);
            zeile.parteiStimmenQueueNameListe.add(liste.getKurznameOderKennwort());
          }
        }
      }
    }
  }
}
