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

import java.util.HashSet;
import java.util.List;
import java.util.Set;

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

import de.ivu.elect.business.person.boundary.PersonendatenDAO;
import de.ivu.elect.business.person.entity.Personendaten;
import de.ivu.elect.business.veranstaltung.control.TeilnahmeCreate;
import de.ivu.elect.business.veranstaltung.entity.Teilnahme;
import de.ivu.elect.business.veranstaltung.entity.TeilnehmerRolle;
import de.ivu.elect.business.veranstaltung.entity.TeilnehmerStatus;
import de.ivu.elect.business.veranstaltung.entity.Veranstaltung;

@Stateless
public class TeilnahmeEdit extends AbstractTeilnahmeEdit {

  @Inject
  VeranstaltungDAO veranstaltungDAO;

  @Inject
  PersonendatenDAO personendatenDAO;

  @Inject
  TeilnahmeCreate teilnahmeCreate;

  public void teilnehmerHinzufuegen(Veranstaltung veranstaltungNotAttached, List<? extends Personendaten> personendatenNotAttached, TeilnehmerRolle rolle) {
    Veranstaltung veranstaltung = veranstaltungDAO.attach(veranstaltungNotAttached);

    for (Personendaten einzuladenePerson : bestimmeAufzunehmendePersonendaten(new HashSet<>(personendatenDAO.attachAll(personendatenNotAttached)), veranstaltung)) {
      Teilnahme teilnahme = new Teilnahme();
      teilnahme.setTeilnehmerRolle(rolle);
      teilnahme.setPersonendaten(einzuladenePerson);
      teilnahme.setVeranstaltung(veranstaltung);
      teilnahmeCreate.save(teilnahme);
    }
  }

  public void deleteAll(List<Teilnahme> teilnahmenNotAttached) {
    for (Teilnahme teilnahme : teilnahmenNotAttached) {
      delete(teilnahme);
    }
  }

  public void deleteAllTeilnahmenDerPerson(Personendaten personendaten) {
    List<Teilnahme> teilnahmen = dao.findByPersonAndWahltermin(personendaten, personendaten.getWahltermin());
    for (Teilnahme teilnahme : teilnahmen) {
      delete(teilnahme);
    }
  }

  private Set<Personendaten> bestimmeAufzunehmendePersonendaten(Set<Personendaten> allePersonendaten, Veranstaltung veranstaltung) {
    Set<Personendaten> result = new HashSet<>(allePersonendaten);
    List<Teilnahme> vorhandeneTeilnahmen = getTeilnahmenDerVeranstaltung(veranstaltung);
    for (Teilnahme teilnahme : vorhandeneTeilnahmen) {
      result.remove(teilnahme.getPersonendaten());
    }

    return result;

  }

  private List<Teilnahme> getTeilnahmenDerVeranstaltung(Veranstaltung veranstaltung) {
    return dao.findByVeranstaltung(veranstaltung);
  }

  public void statusAendern(List<Teilnahme> unattachedTeilnahmeList, TeilnehmerStatus neuerStatus) {
    for (Teilnahme unattachedTeilnahme : unattachedTeilnahmeList) {
      getAttachedEntity(unattachedTeilnahme).setTeilnehmerStatus(neuerStatus);
    }
  }
}
