
package de.ivu.elect.dokumente.veranstaltung;

import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.inject.Inject;

import de.ivu.elect.business.dokumente.control.DokumentExtraFileOutput;
import de.ivu.elect.business.dokumente.entity.DokumentVorlageArt;
import de.ivu.elect.business.veranstaltung.boundary.TeilnahmeDAO;
import de.ivu.elect.business.veranstaltung.control.TeilnahmeComparatorFactory;
import de.ivu.elect.business.veranstaltung.control.VeranstaltungenAlsListeDokumentContext;
import de.ivu.elect.business.veranstaltung.control.VeranstaltungenAlsListeDokumentKonverter;
import de.ivu.elect.business.veranstaltung.entity.Teilnahme;
import de.ivu.elect.business.veranstaltung.entity.Veranstaltung;
import de.ivu.elect.dokumente.konverter.AbstractListDokumentKonverter;

public class ElectVeranstaltungAlsListeDokumentKonverter
    extends
      AbstractListDokumentKonverter<List<Veranstaltung>, VeranstaltungenAlsListeDokumentContext>
    implements
      VeranstaltungenAlsListeDokumentKonverter {

  @Inject
  private TeilnahmeDAO teilnahmeDAO;

  @Inject
  private TeilnahmeComparatorFactory teilnahmeComparatorFactory;

  public ElectVeranstaltungAlsListeDokumentKonverter() {
    super();
  }

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

  @Override
  protected Object konvertiere(List<Veranstaltung> entity, VeranstaltungenAlsListeDokumentContext context,
      DokumentExtraFileOutput dokumentExtraFileOutput) {
    return new VeranstaltungenAlsListeDocument(createBaseElectContext(context, dokumentExtraFileOutput), entity,
        bestimmeTeilnehmerProVeranstaltung(entity));
  }

  private Map<Veranstaltung, List<Teilnahme>> bestimmeTeilnehmerProVeranstaltung(List<Veranstaltung> veranstaltungen) {
    Map<Veranstaltung, List<Teilnahme>> result = new HashMap<>();

    for (Veranstaltung veranstaltung : veranstaltungen) {
      List<Teilnahme> teilnehmer = new ArrayList<>(teilnahmeDAO.findByVeranstaltung(veranstaltung));

      Collections.sort(teilnehmer, teilnahmeComparatorFactory.createTeilnahmeDefaultComparator());

      result.put(veranstaltung, teilnehmer);
    }

    return result;
  }
}
