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

import static java.util.stream.Collectors.toSet;

import java.util.Collection;
import java.util.List;
import java.util.Set;

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.person.entity.Personendaten;
import de.ivu.elect.business.veranstaltung.control.VeranstaltungenAlsListeDokumentContext;
import de.ivu.elect.business.veranstaltung.entity.Teilnahme;
import de.ivu.elect.business.veranstaltung.entity.Veranstaltung;
import de.ivu.elect.business.wahl.entity.Wahl;
import de.ivu.elect.business.wahl.entity.Wahltermin;

@Stateless
public class VeranstaltungenAlsListeDokumentGenerator extends AbstractDokumentGenerator<List<Veranstaltung>, VeranstaltungenAlsListeDokumentContext> {

  @Inject
  private transient VeranstaltungDAO veranstaltungDAO;

  @Inject
  private transient TeilnahmeDAO teilnahmeDAO;

  public VeranstaltungenAlsListeDokumentGenerator() {
    super();
  }

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

  @Override
  protected void postGeneriereDokument(DateiExport dateiExport, List<List<Veranstaltung>> groupsOfVeranstaltungen, DokumentVorlage dokumentVorlage, FileType zieldateiTyp, Wahl wahl,
      Wahltermin wahltermin, VeranstaltungenAlsListeDokumentContext context, ProgressMonitor monitor) {
    super.postGeneriereDokument(dateiExport, groupsOfVeranstaltungen, dokumentVorlage, zieldateiTyp, wahl, wahltermin, context, monitor);

    protokollierePersonendatenDateiExport(attachPersonendaten(groupsOfVeranstaltungen), dateiExport, dokumentVorlage, context.getBenutzer());
  }

  private Set< ? extends Personendaten> attachPersonendaten(Collection<List<Veranstaltung>> groupsOfVeranstaltungen) {
    return groupsOfVeranstaltungen.stream() //
        .flatMap(List::stream) //
        .flatMap(veranstaltung -> teilnahmeDAO.findByVeranstaltung(veranstaltung).stream()) //
        .map(Teilnahme::getPersonendaten) //
        .collect(toSet());
  }

  @Override
  protected List<Veranstaltung> attach(List<Veranstaltung> veranstaltungen, VeranstaltungenAlsListeDokumentContext veranstaltungDokumentContext) {
    return attach(veranstaltungen);
  }

  private List<Veranstaltung> attach(List<Veranstaltung> veranstaltungen) {
    return veranstaltungDAO.attachAll(veranstaltungen);
  }
}
