
package de.ivu.elect.business.search.control;

import javax.ejb.Stateless;
import javax.enterprise.event.Observes;
import javax.enterprise.event.Reception;
import javax.inject.Inject;

import de.ivu.elect.business.benutzerverwaltung.boundary.BenutzerCreateEvent;
import de.ivu.elect.business.benutzerverwaltung.boundary.BenutzerDAO;
import de.ivu.elect.business.benutzerverwaltung.entity.Benutzer;
import de.ivu.elect.business.search.entity.DefaulBenutzerSuchparameter;
import de.ivu.elect.business.wahl.boundary.WahlCreateEvent;
import de.ivu.elect.business.wahl.boundary.WahlDAO;
import de.ivu.elect.business.wahl.boundary.WahlterminCreateEvent;
import de.ivu.elect.business.wahl.boundary.WahlterminDAO;
import de.ivu.elect.business.wahl.entity.Wahl;
import de.ivu.elect.business.wahl.entity.Wahltermin;

@Stateless
public class DefaultBenutzerSuchparameterAnlegenListener {

  @Inject
  private transient DefaultBenutzerSuchparameterProvider defaultBenutzerSuchparameterProvider;

  @Inject
  private transient WahlterminDAO wahlterminDAO;

  @Inject
  private transient WahlDAO wahlDAO;

  @Inject
  private transient BenutzerDAO benutzerDAO;

  @Inject
  private transient DefaultBenutzerSuchparameterAnlegen defaultBenutzerSuchparameterAnlegen;

  public DefaultBenutzerSuchparameterAnlegenListener() {
    super();
  }

  public void onBenuterCreateEvent(@Observes(notifyObserver = Reception.ALWAYS) BenutzerCreateEvent benutzerCreateEvent) {
    Benutzer benutzer = benutzerCreateEvent.getEntity();

    for (DefaulBenutzerSuchparameter defaulBenutzerSuchparameter : defaultBenutzerSuchparameterProvider.getDefaultParameterFuerWahlen()) {
      for (Wahl wahl : wahlDAO.findByAll(benutzer.getMandant())) {
        create(wahl.getWahltermin(), wahl, benutzer, defaulBenutzerSuchparameter);
      }
    }

    for (DefaulBenutzerSuchparameter defaulBenutzerSuchparameter : defaultBenutzerSuchparameterProvider.getDefaultParameterFuerWahltermine()) {
      for (Wahltermin wahltermin : wahlterminDAO.findByAll(benutzer.getMandant())) {
        create(wahltermin, null, benutzer, defaulBenutzerSuchparameter);
      }
    }
  }

  public void onWahlterminCreateEvent(@Observes(notifyObserver = Reception.ALWAYS) WahlterminCreateEvent wahlterminCreateEvent) {
    for (DefaulBenutzerSuchparameter defaulBenutzerSuchparameter : defaultBenutzerSuchparameterProvider.getDefaultParameterFuerWahltermine()) {
      for (Benutzer benutzer : benutzerDAO.findByAll(wahlterminCreateEvent.getEntity().getMandant())) {
        create(wahlterminCreateEvent.getEntity(), null, benutzer, defaulBenutzerSuchparameter);
      }
    }
  }

  public void onWahlCreateEvent(@Observes(notifyObserver = Reception.ALWAYS) WahlCreateEvent wahlCreateEvent) {
    for (DefaulBenutzerSuchparameter defaulBenutzerSuchparameter : defaultBenutzerSuchparameterProvider.getDefaultParameterFuerWahlen()) {
      for (Benutzer benutzer : benutzerDAO.findByAll(wahlCreateEvent.getEntity().getMandant())) {
        create(wahlCreateEvent.getEntity().getWahltermin(), wahlCreateEvent.getEntity(), benutzer, defaulBenutzerSuchparameter);
      }
    }
  }

  private void create(Wahltermin wahltermin, Wahl wahl, Benutzer benutzer, DefaulBenutzerSuchparameter defaulBenutzerSuchparameter) {
    defaultBenutzerSuchparameterAnlegen.create(wahltermin, wahl, benutzer.getBenutzerkennung(), defaulBenutzerSuchparameter.getViewId(), defaulBenutzerSuchparameter.getName(),
        defaulBenutzerSuchparameter.getSuchparameter());
  }
}
