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

import java.util.List;
import java.util.stream.Collectors;

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

import de.ivu.elect.business.exchange.control.AbstractExporter;
import de.ivu.elect.business.exchange.control.ExportExchange;
import de.ivu.elect.business.exchange.entity.DateiExportArt;
import de.ivu.elect.business.gruppe.boundary.GruppeDAO;
import de.ivu.elect.business.gruppe.entity.Gruppe;
import de.ivu.elect.business.kandidatur.boundary.KandidaturDAO;
import de.ivu.elect.business.kandidatur.entity.Kandidatur;
import de.ivu.elect.business.stimmzettel.control.StimmzettelExportContext;
import de.ivu.elect.business.stimmzettel.control.StimmzettelExportExchange;
import de.ivu.elect.business.stimmzettel.control.StimmzettelExportObject;
import de.ivu.elect.business.wahl.boundary.WahlDAO;
import de.ivu.elect.business.wahl.entity.Wahl;
import de.ivu.elect.business.wahlvorschlag.boundary.WahlvorschlagDAO;
import de.ivu.elect.business.wahlvorschlag.entity.Wahlvorschlag;

@Stateless
public class StimmzettelExporter extends AbstractExporter<StimmzettelExportObject, StimmzettelExportContext> {

  @Inject
  private transient WahlDAO wahlDAO;

  @Inject
  private transient GruppeDAO gruppeDAO;

  @Inject
  private transient WahlvorschlagDAO wahlvorschlagDAO;

  @Inject
  private transient KandidaturDAO kandidaturDAO;

  @Inject
  private transient StimmzettelExportExchange exportExchange;

  @Override
  public ExportExchange<StimmzettelExportObject, StimmzettelExportContext> getExchange() {
    return exportExchange;
  }

  @Override
  protected DateiExportArt getDateiExportArt() {
    return DateiExportArt.STIMMZETTEL_EXPORT;
  }

  @Override
  public StimmzettelExportObject getExportObject(StimmzettelExportContext context) {
    Wahl wahl = wahlDAO.attach(context.getWahl());

    return new StimmzettelExportObject(getKandidaturen(wahl), getWahlvorschlaege(wahl), getGruppen(wahl));
  }

  private List<Gruppe> getGruppen(Wahl wahl) {
    return gruppeDAO.findByWahl(wahl);
  }

  private List<Wahlvorschlag> getWahlvorschlaege(Wahl wahl) {
    return wahlvorschlagDAO.findByWahl(wahl);
  }

  private List<Kandidatur> getKandidaturen(Wahl wahl) {
    return kandidaturDAO.findByWahl(wahl)/* ELECTKOM-117 */.stream().filter(k -> k.getWahlvorschlag() != null).collect(Collectors.toList());
  }

  /**
   * @deprecated
   * @see AbstractExporter#addProperties
   */
  @Deprecated
  public boolean isDokumentVorlageBenoetigt(StimmzettelExportContext context) {
    return exportExchange.isDokumentVorlageBenoetigt(context);
  }
}
