
package de.ivu.elect.business.ergebnis.boundary;

import java.util.List;

import javax.ejb.Stateless;
import javax.inject.Inject;

import de.ivu.elect.business.datei.entity.DateiExport;
import de.ivu.elect.business.datei.entity.FileType;
import de.ivu.elect.business.dokumente.boundary.AbstractDokumentGenerator;
import de.ivu.elect.business.dokumente.control.ProgressMonitor;
import de.ivu.elect.business.dokumente.entity.DokumentVorlage;
import de.ivu.elect.business.dokumente.entity.DokumentVorlageArt;
import de.ivu.elect.business.ergebnis.control.ErgebnisDaten;
import de.ivu.elect.business.ergebnis.control.ErgebnisDatenCreator;
import de.ivu.elect.business.ergebnis.entity.Ergebnis;
import de.ivu.elect.business.ergebnis.entity.Ergebnisart;
import de.ivu.elect.business.wahl.entity.Wahl;
import de.ivu.elect.business.wahl.entity.Wahltermin;

@Stateless
public class GesamtErgebnisVergleichDokumentGenerator extends AbstractDokumentGenerator<Ergebnis, GesamtErgebnisVergleichDokumentContext> {

  @Inject
  private transient ErgebnisDAO ergebnisDAO;

  @Inject
  private transient ErgebnisDatenCreator ergebnisDatenCreator;

  public GesamtErgebnisVergleichDokumentGenerator() {
    super();
  }

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

  @Override
  protected Ergebnis attach(Ergebnis template, GesamtErgebnisVergleichDokumentContext context) {
    Ergebnis ergebnisAktuell = ergebnisDAO.attach(template);
    ErgebnisDaten ergebnisDatenAktuell = ergebnisDatenCreator.createErgebnisDatenExporte(ergebnisAktuell);

    Ergebnisart ergebnisartVergleich = Ergebnisart.VORLAEUFIG;

    if (ergebnisAktuell.isVorlaeufig()) {
      ergebnisartVergleich = Ergebnisart.ENDGUELTIG;
    }

    List<Ergebnis> ergebnisseVergleich = ergebnisDAO.findByWahlAndErgebnisart(ergebnisAktuell.getWahl(), ergebnisartVergleich);
    ErgebnisDaten ergebnisDatenVergleich = null;

    if (!ergebnisseVergleich.isEmpty()) {
      ergebnisDatenVergleich = ergebnisDatenCreator.createErgebnisDatenExporte(ergebnisseVergleich.get(0));
    }

    context.setErgebnisDatenAktuell(ergebnisDatenAktuell);
    context.setErgebnisDatenVergleich(ergebnisDatenVergleich);

    return ergebnisAktuell;
  }

  @Override
  protected void postGeneriereDokument(DateiExport dateiExport, List<Ergebnis> ergebnisse, DokumentVorlage dokumentVorlage, FileType zieldateiTyp, Wahl wahl, Wahltermin wahltermin,
      GesamtErgebnisVergleichDokumentContext gesamtErgebnisDokumentContext, ProgressMonitor monitor) {
    super.postGeneriereDokument(dateiExport, ergebnisse, dokumentVorlage, zieldateiTyp, wahl, wahltermin, gesamtErgebnisDokumentContext, monitor);

    // Aufräumen für Garbage Collection...
    gesamtErgebnisDokumentContext.removeErgebnisDaten();
  }
}
