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

import java.util.HashSet;
import java.util.Locale;
import java.util.Set;

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

import de.ivu.elect.business.system.boundary.SystemLogWriter;
import de.ivu.elect.business.system.entity.SystemLogQuelle;
import de.ivu.elect.business.wahl.entity.Wahl;
import de.ivu.elect.business.wahl.entity.Wahltermin;
import de.ivu.elect.jee.faces.UserLocale;
import de.ivu.elect.jee.protokollierung.ProtokollThreadLocal;

@Stateless
@Specializes
public class CoreWahlEdit extends WahlEdit {

  private static final Locale SYSTEM_LOCALE = Locale.getDefault(); // ELECT-12647, Locale/TimeZone der Anwendung...

  @Inject
  private transient WahlterminEdit wahlterminEdit;

  @Inject
  private transient SystemLogWriter systemLogWriter;

  public CoreWahlEdit() {
    super();
  }

  @Override
  // für Hintergrungprozesse nicht möglich @UseCaseSecure(UseCasePermission.WAHL_DELETE)
  public void delete(Wahl wahlNotAttched) {
    Wahl wahl = getAttachedEntity(wahlNotAttched);

    systemLogWriter.writeInfoLogMessageFuerMandant(wahl,
        messages.getMessageForMessageKey("loesch.protokoll.wahl", ProtokollThreadLocal.getBenutzerKennung(), wahl.getName(), UserLocale.formatDateMedium(wahl.getWahldatum(), SYSTEM_LOCALE)),
        SystemLogQuelle.GELOESCHT);

    Wahltermin wahltermin = wahl.getWahltermin();

    Set<Wahl> otherWahlenByWahltermin = new HashSet<>(wahltermin.getWahlsByWahltermin());
    otherWahlenByWahltermin.remove(wahl);

    super.delete(wahl);

    // WASDE-1003
    if (otherWahlenByWahltermin.isEmpty()) {
      wahlterminEdit.delete(wahltermin);
    }
  }
}
