
package de.ivu.elect.dokumente.wahltermin;

import java.util.ArrayList;
import java.util.List;
import java.util.function.Function;

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.DokumentGeneratorArt;
import de.ivu.elect.business.dokumente.entity.DokumentKonverterResult;
import de.ivu.elect.business.dokumente.entity.DokumentVorlageArt;
import de.ivu.elect.business.gebietsbaum.boundary.GebietDAO;
import de.ivu.elect.business.gebietsbaum.control.GebietByBreadthFirstComparator;
import de.ivu.elect.business.gebietsbaum.entity.Gebiet;
import de.ivu.elect.business.wahl.control.WahlDokumentKonverter;
import de.ivu.elect.business.wahl.control.WahlterminDokumentContext;
import de.ivu.elect.business.wahl.entity.WahlOderWahltermin;
import de.ivu.elect.business.wahl.entity.Wahltermin;
import de.ivu.elect.dokumente.BaseElectContext;
import de.ivu.elect.dokumente.konverter.AbstractDokumentKonverter;


import static java.util.Collections.singletonList;

public class WahlterminDokumentKonverter
  extends
  AbstractDokumentKonverter<WahlterminDokumentContext>
  implements
  WahlDokumentKonverter {

  @Inject
  private transient GebietDAO gebietDAO;

  public WahlterminDokumentKonverter() {
    super();
  }

  @Override
  public DokumentKonverterResult konvertiereInDokumentEingabe(List<Wahltermin> entities, WahlterminDokumentContext wahlterminDokumentContext, DokumentExtraFileOutput dokumentExtraFileOutput, ProgressMonitor monitor) {
    Function<WahlOderWahltermin, List<Gebiet>> loader = w -> {
      List<Gebiet> result = new ArrayList<>();
      if (w.isInstanceOfWahl()) {
        result = gebietDAO.findByWahl(w.getWahlIfWahl());
      } else if (w.isInstanceOfWahltermin()) {
        result = gebietDAO.findByWahltermin(w.getWahlterminIfWahltermin());
      }
      result.sort(new GebietByBreadthFirstComparator());
      return result;
    };

    BaseElectContext baseElectContext = createBaseElectContext(wahlterminDokumentContext, dokumentExtraFileOutput);
    List<Object> objects = singletonList(
      new WahlterminDokument(baseElectContext, loader, getWahlhelfereinsatzortBuilder(baseElectContext)));
    return new DokumentKonverterResult(objects, DokumentGeneratorArt.OPEN_OFFICE_GENERATOR);
  }

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

  protected Function<Gebiet, PlatzhalterWahlhelfereinsatzortDokument> getWahlhelfereinsatzortBuilder(BaseElectContext baseElectContext) {
    return g -> new PlatzhalterWahlhelfereinsatzortDokument();
  }

}
