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

import java.util.ArrayList;
import java.util.List;

import javax.inject.Inject;

import de.ivu.elect.business.dokumente.control.DokumentExtraFileOutput;
import de.ivu.elect.business.dokumente.entity.DokumentVorlageArt;
import de.ivu.elect.business.ergebnis.boundary.GesamtErgebnisVergleichDokumentContext;
import de.ivu.elect.business.ergebnis.control.ErgebnisDaten;
import de.ivu.elect.business.ergebnis.control.GesamtErgebnisVergleichDokumentKonverter;
import de.ivu.elect.business.ergebnis.entity.Ergebnis;
import de.ivu.elect.business.gebietsbaum.boundary.GebietDAO;
import de.ivu.elect.business.gebietsbaum.boundary.WahlverwaltungGebietInformationResolver;
import de.ivu.elect.business.gebietsbaum.entity.Wahldurchfuehrungsgebiet;
import de.ivu.elect.business.niederschrift.boundary.NiederschriftDAO;
import de.ivu.elect.business.niederschrift.boundary.NiederschriftFormatter;
import de.ivu.elect.business.niederschrift.entity.Niederschrift;
import de.ivu.elect.business.stimmen.boundary.GruppeStimmeLabelGenerator;
import de.ivu.elect.dokumente.WasElectContext;
import de.ivu.elect.dokumente.WasElectContextBuilder;
import de.ivu.elect.dokumente.kandidatur.KandidaturCoreDaten;
import de.ivu.elect.dokumente.konverter.AbstractListDokumentKonverter;

public class DefaultGesamtErgebnisVergleichDokumentKonverter extends AbstractListDokumentKonverter<Ergebnis, GesamtErgebnisVergleichDokumentContext>
    implements
      GesamtErgebnisVergleichDokumentKonverter {

  @Inject
  private transient GebietDAO gebietDAO;

  @Inject
  private transient NiederschriftDAO niederschriftDAO;

  @Inject
  private transient NiederschriftFormatter niederschriftFormatter;

  @Inject
  private transient WasElectContextBuilder wasElectContextBuilder;

  @Inject
  private transient WahlverwaltungGebietInformationResolver wahlverwaltungGebietInformationResolver;

  @Inject
  private transient GruppeStimmeLabelGenerator gruppeStimmeLabelGenerator;

  public DefaultGesamtErgebnisVergleichDokumentKonverter() {
    super();
  }

  @Override
  public DokumentVorlageArt getDokumentVorlageArt() {
    return DokumentVorlageArt.GESAMT_ERGEBNIS_VERGLEICH;
  }

  @Override
  protected Object konvertiere(Ergebnis ergebnis, GesamtErgebnisVergleichDokumentContext context, DokumentExtraFileOutput dokumentExtraFileOutput) {
    ErgebnisDaten ergebnisDatenAktuell = context.getErgebnisDatenAktuell();
    ErgebnisDaten ergebnisDatenVergleich = context.getErgebnisDatenVergleich();

    WasElectContext wasElectContext = wasElectContextBuilder.create(createBaseElectContext(context, dokumentExtraFileOutput));

    KandidaturCoreDaten kandidaturCoreDaten = new KandidaturCoreDaten(wasElectContext, ergebnisDatenAktuell.getEntityAufStimmzettelDaten(), context.getKandidaturFormatDarstellung());

    List<Wahldurchfuehrungsgebiet> auswertungsgebiete = new ArrayList<>(context.collectGebieteExportierbar(gebietDAO, ergebnisDatenAktuell.getGebiete()));

    List<Niederschrift> niederschriftenInWahl = niederschriftDAO.findByWahl(wasElectContext.getWahl());

    return new GesamtErgebnisVergleichDokument(wasElectContext, auswertungsgebiete, context.getStimmabgabeart(), wahlverwaltungGebietInformationResolver, ergebnisDatenAktuell, ergebnisDatenVergleich,
        gruppeStimmeLabelGenerator, kandidaturCoreDaten, niederschriftFormatter, niederschriftenInWahl);
  }
}
