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

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

import de.ivu.elect.business.kandidatur.boundary.KandidaturCreateEvent;
import de.ivu.elect.business.kandidatur.boundary.KandidaturDAO;
import de.ivu.elect.business.kandidatur.entity.Direktkandidatur;
import de.ivu.elect.business.kandidatur.entity.Kandidatur;
import de.ivu.elect.business.wahlrechtspruefung.entity.AbstractPruefkriterium;
import de.ivu.elect.business.wahlrechtspruefung.entity.Pruefkriterium;
import de.ivu.elect.business.wahlvorschlag.entity.Direktkandidat;


import static de.ivu.elect.jee.entity.EntityUtil.castTo;

@Stateless
public class WahlrechtspruefungenAnlegenKandidaturCreateEventListener extends AbstractWahlrechtspruefungenAnlegenListener {

  @Inject
  private transient KandidaturDAO kandidaturDAO;

  public WahlrechtspruefungenAnlegenKandidaturCreateEventListener() {
    super();
  }

  /**
   * Lege Wahlrechtsprüfungen für alle bestehenden Prüfkriterien der Wahl an, wenn eine neue Kandidatur hinzukommt...
   */
//  @TransactionAttribute(TransactionAttributeType.REQUIRES_NEW) // ELECT-3319
//  public void listen(@Observes(notifyObserver = Reception.ALWAYS, during = TransactionPhase.AFTER_SUCCESS) KandidaturCreateEvent event) {
  // @TransactionAttribute(TransactionAttributeType.REQUIRES_NEW) // ELECT-3319
  public void listen(@Observes(notifyObserver = Reception.ALWAYS, during = TransactionPhase.IN_PROGRESS) KandidaturCreateEvent event) {
    Kandidatur kandidatur = kandidaturDAO.attach(event.getEntity());

    if (kandidatur != null) {
      if (kandidatur.isDirektkandidatur()) {
        Direktkandidatur direktkandidatur = castTo(kandidatur, Direktkandidatur.class);
        for (Pruefkriterium pruefkriterium : collectPruefkriterien(direktkandidatur.getWahl(), direktkandidatur)) {
          createWahlrechtspruefung(pruefkriterium, direktkandidatur);
        }
        Direktkandidat direktkandidat = direktkandidatur.getDirektkandidat();
        for (Pruefkriterium pruefkriterium : collectPruefkriterien(direktkandidat.getWahl(), direktkandidat)) {
          createWahlrechtspruefung(pruefkriterium, direktkandidat, direktkandidatur);
        }
      } else {
        for (Pruefkriterium pruefkriterium : collectPruefkriterien(kandidatur.getWahl(), kandidatur)) {
          createWahlrechtspruefung(pruefkriterium, kandidatur);
        }
      }
      kandidatur.getTransientContext().remove(AbstractPruefkriterium.KEINE_EXISTENZPRUEFUNG_BEIM_ANLEGEN);
    }
  }
}
