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

import javax.enterprise.event.Observes;
import javax.enterprise.event.Reception;
import javax.enterprise.event.TransactionPhase;
import javax.inject.Inject;
import javax.persistence.NoResultException;

import de.ivu.elect.business.WusFeaturesAktiviert;
import de.ivu.elect.business.gebietsbaum.boundary.GebietCreateEvent;
import de.ivu.elect.business.gebietsbaum.entity.Gebiet;
import de.ivu.elect.business.gruppe.boundary.GruppeDAO;
import de.ivu.elect.business.gruppe.entity.Gruppe;
import de.ivu.elect.business.gruppe.entity.SystemGruppe;
import de.ivu.elect.business.gruppe.entity.SystemGruppeEigenschaften;
import de.ivu.elect.business.gruppeimgebiet.boundary.GruppeImGebietFactory;
import de.ivu.elect.business.gruppeimgebiet.control.GruppeImGebietCreate;
import de.ivu.elect.business.gruppeimgebiet.entity.GruppeImGebiet;

public class GruppenImGebietAnlegenGebietCreateEventListener {

  @Inject
  private transient GruppeImGebietCreate gruppeImGebietCreate;

  @Inject
  private transient GruppeImGebietFactory gruppeImGebietFactory;

  @Inject
  private transient SystemGruppeEigenschaften systemGruppenEigenschaften;

  @Inject
  private transient GruppeDAO gruppeDAO;

  @Inject
  private transient WusFeaturesAktiviert wusFeaturesAktiviert;

  public void listen(@Observes(notifyObserver = Reception.ALWAYS, during = TransactionPhase.IN_PROGRESS) GebietCreateEvent event) {

    if (wusFeaturesAktiviert.isWusOderWusWasZusammen()) {
      Gebiet entity = event.getEntity();
      for (SystemGruppe systemGruppe : SystemGruppe.values()) {

        try {
          Gruppe gruppe = gruppeDAO.findByUK(systemGruppenEigenschaften.createGruppeAusSystemGruppe(systemGruppe,
              entity.getWahl()).getGruppeUK());

          GruppeImGebiet gruppeImGebiet = gruppeImGebietFactory.create();
          gruppeImGebiet.setGebiet(entity);
          gruppeImGebiet.setGruppe(gruppe);
          gruppeImGebiet.setRelativePosition(systemGruppenEigenschaften.getPosition(systemGruppe));
          gruppeImGebietCreate.save(gruppeImGebiet);
        } catch (NoResultException nre) {
          // Gruppe nicht gefunden, dies passiert beim Wahl-Import, da an dieser Stelle noch keine Gruppen im System sind. In diesem Fall ist nichts zu tun, die GruppeImGebiet-Objekte werden ebenfalls durch den Wahlimport erstellt - nicht schön, aber so isses erstmal...
        }
      }
    }
  }
}
