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

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.GesamtErgebnisDokumentContext;
import de.ivu.elect.business.ergebnis.control.GesamtErgebnisDokumentKonverter;
import de.ivu.elect.business.ergebnis.entity.Ergebnis;
import de.ivu.elect.business.ergebnis.entity.Stimmabgabeart;
import de.ivu.elect.business.gebietsbaum.boundary.WahldurchfuehrungsgebietDAO;
import de.ivu.elect.business.niederschrift.boundary.NiederschriftDAO;
import de.ivu.elect.business.niederschrift.boundary.NiederschriftFormatter;
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 DefaultGesamtErgebnisDokumentKonverter extends AbstractListDokumentKonverter<Ergebnis, GesamtErgebnisDokumentContext> implements GesamtErgebnisDokumentKonverter {

  @Inject
  private transient WahldurchfuehrungsgebietDAO wahldurchfuehrungsgebietDAO;

  @Inject
  private transient NiederschriftDAO niederschriftDAO;

  @Inject
  private transient NiederschriftFormatter niederschriftFormatter;

  @Inject
  private transient WasElectContextBuilder wasElectContextBuilder;

  @Inject
  private transient GruppeStimmeLabelGenerator gruppeStimmeLabelGenerator;

  public DefaultGesamtErgebnisDokumentKonverter() {
    super();
  }

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

  @Override
  public GesamtErgebnisDokument konvertiere(Ergebnis ergebnis, GesamtErgebnisDokumentContext context, DokumentExtraFileOutput dokumentExtraFileOutput) {
    var ergebnisDaten = context.getErgebnisDaten();

    var wasElectContext = createWasElectContext(context, dokumentExtraFileOutput);

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

    var gebiete = wahldurchfuehrungsgebietDAO.attachAll(context.getGebiete());
    var gebieteMitDetails = wahldurchfuehrungsgebietDAO.attachAll(context.getGebieteMitDetails());

    var stimmabgabeart = Stimmabgabeart.GESAMT; // ELECT-9785

    return new GesamtErgebnisDokument(wasElectContext, ergebnisDaten, gebiete, stimmabgabeart, gebieteMitDetails, gruppeStimmeLabelGenerator, kandidaturCoreDaten, niederschriftFormatter,
        niederschriftDAO.findByWahl(ergebnisDaten.getWahl()));
  }

  protected WasElectContext createWasElectContext(GesamtErgebnisDokumentContext context, DokumentExtraFileOutput dokumentExtraFileOutput) {
    return wasElectContextBuilder.create(createBaseElectContext(context, dokumentExtraFileOutput));
  }
}
