
package de.ivu.elect.dokumente.stimmeingabe;

import static de.ivu.elect.business.dokumente.entity.DokumentKonverterResult.openOfficeFromList;

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

import javax.enterprise.inject.Specializes;
import javax.inject.Inject;

import de.ivu.elect.business.dokumente.control.DokumentExtraFileOutput;
import de.ivu.elect.business.dokumente.control.ProgressMonitor;
import de.ivu.elect.business.dokumente.entity.DokumentGenerierenProgress;
import de.ivu.elect.business.dokumente.entity.DokumentKonverterResult;
import de.ivu.elect.business.stimmeingabe.control.StimmeingabeDocumentByErgebniseingangExportContext;
import de.ivu.elect.business.stimmeingabe.control.StimmeingabeDocumentByErgebniseingangExportObject;
import de.ivu.elect.business.stimmeingabe.control.WasStimmeingabeDocumentByErgebniseingangExportObject;
import de.ivu.elect.business.stimmeingabe.entity.Ergebniseingang;
import de.ivu.elect.dokumente.CoreElectContext;
import de.ivu.elect.dokumente.CoreElectContextBuilder;

@Specializes
public class WasStimmeingabeDocumentByErgebniseingangDokumentKonverter extends CoreStimmeingabeDocumentByErgebniseingangDokumentKonverter {

  @Inject
  private transient WasStimmeingabeDocumentFactory stimmeingabeDocumentFactory;

  @Inject
  private transient CoreElectContextBuilder coreElectContextBuilder;

  public WasStimmeingabeDocumentByErgebniseingangDokumentKonverter() {
    super();
  }

  @Override
  public DokumentKonverterResult konvertiereInDokumentEingabe(List<StimmeingabeDocumentByErgebniseingangExportObject< ? >> exportObjects,
      StimmeingabeDocumentByErgebniseingangExportContext exportContext, DokumentExtraFileOutput dokumentExtraFileOutput, ProgressMonitor monitor) {
    List<Object> result = new ArrayList<>(exportObjects.size());

    int count = 0;
    int size = exportObjects.size();

    CoreElectContext coreElectContext = coreElectContextBuilder.create(createBaseElectContext(exportContext, dokumentExtraFileOutput));

    for (StimmeingabeDocumentByErgebniseingangExportObject< ? > exportObject : exportObjects) {
      if (monitor.isCanceled()) {
        return openOfficeFromList(result);
      }

      List<Ergebniseingang> ergebniseingaengeSorted = new ArrayList<>(((WasStimmeingabeDocumentByErgebniseingangExportObject) exportObject).getErgebniseingaenge());
      ergebniseingaengeSorted.sort(AbstractWasStimmeingabeDocumentByErgebniseingangExportMapper.ERGEBNISEINGANG_COMPARATOR);

      for (Ergebniseingang ergebniseingang : ergebniseingaengeSorted) {
        count++;

        result.add(stimmeingabeDocumentFactory.createDocumentFuerErfassungsgebiet(new StimmeingabeDocumentContext(coreElectContext, exportContext), ergebniseingang));

        monitor.progress(DokumentGenerierenProgress.MAPPE_ENTITY, count, size);
      }
    }

    return openOfficeFromList(result);
  }
}
