
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.VeranstaltungDokumentContext;
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 VeranstaltungDokumentGenerator extends AbstractDokumentGenerator<Veranstaltung, VeranstaltungDokumentContext> {

  @Inject
  private transient VeranstaltungDAO veranstaltungDAO;

  @Inject
  private transient TeilnahmeDAO teilnahmeDAO;

  public VeranstaltungDokumentGenerator() {
    super();
  }

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

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

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

  private Set< ? extends Personendaten> attachPersonendaten(Collection<Teilnahme> teilnahmen) {
    return attach(teilnahmen).stream().map(Teilnahme::getPersonendaten).collect(toSet());
  }

  @Override
  protected Veranstaltung attach(Veranstaltung veranstaltung, VeranstaltungDokumentContext context) {
    context.setTeilnahmen(attach(context.getTeilnahmen()));

    return attach(veranstaltung);
  }

  private Veranstaltung attach(Veranstaltung veranstaltung) {
    return veranstaltungDAO.attach(veranstaltung);
  }

  private List<Teilnahme> attach(Collection<Teilnahme> teilnahmen) {
    return teilnahmeDAO.attachAll(teilnahmen);
  }
}
