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

import java.util.Date;

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

import de.ivu.elect.business.gebietsbaum.boundary.GebietEdit;
import de.ivu.elect.business.gebietsbaum.entity.Gebiet;
import de.ivu.elect.business.mandant.entity.Mandant;
import de.ivu.elect.business.replikation.boundary.ReplikationErzeugen;
import de.ivu.elect.business.security.UseCasePermission;
import de.ivu.elect.business.security.UseCaseSecure;
import de.ivu.elect.business.stimmeingabe.control.GeloeschteErgebniseingangEingangssequenznummerSpeichern;
import de.ivu.elect.business.wahl.entity.Wahl;

@Stateless
@Specializes
public class WasWahlEdit extends CoreWahlEdit {

  @Inject
  private transient WahldurchfuehrungDAO wahldurchfuehrungDao;

  @Inject
  private transient ReplikationErzeugen replikationErzeugen;

  @Inject
  private transient GebietEdit gebietEdit;

  @Inject
  private transient GeloeschteErgebniseingangEingangssequenznummerSpeichern geloeschteErgebniseingangEingangssequenznummerSpeichern;

  public WasWahlEdit() {
    super();
  }

  @Override
  public void save(Wahl entity, Mandant mandant, Date neuesWahldatum, String neueNummer) {
    Wahl wahlattachedVorher = getAttachedEntity(entity);
    Date altesWahldatum = wahlattachedVorher.getWahldatum();
    String alteNummer = wahlattachedVorher.getWahlterminNummer();

    super.save(entity, mandant, neuesWahldatum, neueNummer);

    for (Gebiet gebiet : wahlattachedVorher.getEditGebiete()) {
      if (gebiet.isAttributeChanged()) {
        gebietEdit.save(gebiet);
      }
    }

    wahldurchfuehrungDao.flush();

    replikationErzeugen.replikationWahlUpdate(wahldurchfuehrungDao.refresh(wahldurchfuehrungDao.findByPrimaryKey(entity.getId())), altesWahldatum, neuesWahldatum, alteNummer, neueNummer);
  }

  @Override
  // für Hintergrungprozesse nicht möglich @UseCaseSecure(UseCasePermission.WAHL_DELETE)
  public void delete(Wahl entity) {
    if (entity!=null) {
      Long id = entity.getId();
      replikationErzeugen.replikationWahlLoeschen(wahldurchfuehrungDao.findByPrimaryKey(id));

      geloeschteErgebniseingangEingangssequenznummerSpeichern.speichereEingangssequenznummerInKonfiguration();
      wahldurchfuehrungDao.flush();
      wahldurchfuehrungDao.clear();

      super.delete(wahldurchfuehrungDao.findByPrimaryKey(id));
    }
  }
}
