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

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.GesamtErgebnisDokumentContext;
import de.ivu.elect.business.ergebnis.control.ErgebnisDaten;
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.gebietsbaum.entity.Wahldurchfuehrungsgebiet;
import de.ivu.elect.business.niederschrift.boundary.NiederschriftDAO;
import de.ivu.elect.business.niederschrift.boundary.NiederschriftFormatter;
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;

  public DefaultGesamtErgebnisDokumentKonverter() {
    super();
  }

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

  @Override
  protected Object konvertiere(Ergebnis ergebnis, GesamtErgebnisDokumentContext context, DokumentExtraFileOutput dokumentExtraFileOutput) {
    ErgebnisDaten ergebnisDaten = context.getErgebnisDaten();

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

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

    List<Wahldurchfuehrungsgebiet> gebiete = wahldurchfuehrungsgebietDAO.attachAll(context.getGebiete());
    List<Wahldurchfuehrungsgebiet> gebieteMitDetails = wahldurchfuehrungsgebietDAO.attachAll(context.getGebieteMitDetails());

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

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