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

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.stimmzettel.boundary.EntityAufStimmzettelDatenDAOFactory;
import de.ivu.elect.business.stimmzettel.entity.EntityAufStimmzettelDaten;
import de.ivu.elect.business.wahl.boundary.WahlDAO;
import de.ivu.elect.business.wahl.entity.Wahl;
import de.ivu.elect.business.wahlvorschlagsperson.control.WahlvorschlagsPersonExportContext;
import de.ivu.elect.business.wahlvorschlagsperson.control.WahlvorschlagsPersonExportExchange;
import de.ivu.elect.business.wahlvorschlagsperson.entity.WahlvorschlagsPerson;
import de.ivu.elect.business.wahlvorschlagsperson.entity.WahlvorschlagsPersonExportObject;

import javax.ejb.Stateless;
import javax.inject.Inject;
import java.util.List;
import java.util.Objects;
import java.util.stream.Collectors;

@Stateless
public class WahlvorschlagsPersonExporter extends AbstractExporter<WahlvorschlagsPersonExportObject, WahlvorschlagsPersonExportContext> {

  @Inject
  private transient EntityAufStimmzettelDatenDAOFactory entityAufStimmzettelDatenDAOFactory;

  @Inject
  private transient WahlvorschlagsPersonExportExchange wahlvorschlagsPersonExportExchange;

  @Inject
  private transient WahlvorschlagsPersonDAO wahlvorschlagsPersonDAO;

  @Inject
  private transient WahlDAO wahlDAO;

  @Override
  protected ExportExchange<WahlvorschlagsPersonExportObject, WahlvorschlagsPersonExportContext> getExchange() {
    return wahlvorschlagsPersonExportExchange;
  }

  @Override
  protected WahlvorschlagsPersonExportObject getExportObject(WahlvorschlagsPersonExportContext context) {
    WahlvorschlagsPersonExportObject wahlvorschlagsPersonExportObject = new WahlvorschlagsPersonExportObject();

    EntityAufStimmzettelDaten entityAufStimmzettelDaten = entityAufStimmzettelDatenDAOFactory.getEntityAufStimmzettelDaten();

    Wahl wahl = wahlDAO.attach(context.getWahl());

    wahlvorschlagsPersonExportObject.getWahlvorschlagsPersonen()
            .addAll(getAllWahlvorschlagsPersonen(entityAufStimmzettelDaten, wahl));

    return wahlvorschlagsPersonExportObject;
  }

  private List<WahlvorschlagsPerson> getAllWahlvorschlagsPersonen(EntityAufStimmzettelDaten entityAufStimmzettelDaten, Wahl wahl) {
    return entityAufStimmzettelDaten.collectWahlvorschlaegeInWahl(wahl).stream()
            .flatMap(wv -> wahlvorschlagsPersonDAO.findByWahlvorschlag(wv).stream())
            .filter(Objects::nonNull)
            .collect(Collectors.toList());
  }

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

  @Override
  protected boolean isExportHeader() {
    return true;
  }
}
