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

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

import de.ivu.elect.business.personenpruefung.boundary.PersonenPruefungStarter;
import de.ivu.elect.business.personenpruefung.control.CorePersonenPruefungVorbereiter;
import de.ivu.elect.business.personenpruefung.control.WahlausschussmitgliedPruefungAttributeChangedChecker;
import de.ivu.elect.business.wahlausschuss.entity.Wahlausschussmitglied;

@Stateless
public class WahlausschussmitgliedEdit extends AbstractWahlausschussmitgliedEdit {

  @Inject
  private transient WahlausschussmitgliedPruefungAttributeChangedChecker personenPruefungAttributeChangedChecker;

  @Inject
  private transient CorePersonenPruefungVorbereiter personenPruefungVorbereiter;

  @Inject
  private transient PersonenPruefungStarter personenPruefungStarter;

  public WahlausschussmitgliedEdit() {
    super();
  }

  @Override
  protected boolean usesMixedTransactionalContexts() {
    // ELECT-945, bspw. CorePersonenPruefungVorbereiter verwendet 'normale' DAOs!
    return true;
  }

  @Override
  public void save(Wahlausschussmitglied wahlausschussmitglied) {
    // NOTE ELECT-2749, dass Änderungen festgestellt werden müssen, bevor die Entität gespeichert wird.
    personenPruefungAttributeChangedChecker.bestimmeAttributeChanged(wahlausschussmitglied);

    // NOTE that the super implementation performs an ExtendedDao.flush()!
    super.save(wahlausschussmitglied);

    // NOTE ELECT-2749, dass die Prüfung vorbereitet werden muss, nachdem die Entität gespeichert wurde.
    // NOTE bzgl. attachFresh: ELECT-3187 (Änderungen an Entität werden nicht gespeichert)
    personenPruefungVorbereiter.prepareWahlausschussmitgliedPruefung(dao.refresh(wahlausschussmitglied), personenPruefungAttributeChangedChecker);

    personenPruefungStarter.startePersonenPruefung();
  }

  @Override
  public void delete(Wahlausschussmitglied template) {
    Wahlausschussmitglied wahlausschussmitglied = getAttachedEntity(template);

    personenPruefungVorbereiter.deleteAllVerknuepfungenAndMarkVerknuepftePersonenUngeprueft(wahlausschussmitglied);

    super.delete(wahlausschussmitglied);

    personenPruefungStarter.startePersonenPruefung();
  }
}
