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

import java.util.Locale;

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

import de.ivu.elect.business.benutzerverwaltung.boundary.RolleEdit;
import de.ivu.elect.business.dokumente.boundary.DokumentVorlageDAO;
import de.ivu.elect.business.dokumente.entity.DokumentVorlage;
import de.ivu.elect.business.dokumente.entity.DokumentVorlageAnlageArt;
import de.ivu.elect.business.mandant.boundary.MandantExtendedDAO;
import de.ivu.elect.business.security.UseCasePermission;
import de.ivu.elect.business.security.UseCaseSecure;
import de.ivu.elect.business.system.boundary.SystemLogWriter;
import de.ivu.elect.business.system.control.files.FileCleanupEvent;
import de.ivu.elect.business.system.entity.SystemLogQuelle;
import de.ivu.elect.business.wahl.control.WahlterminValidator;
import de.ivu.elect.business.wahl.entity.Wahltermin;
import de.ivu.elect.business.wahl.entity.WahlterminStatus;
import de.ivu.elect.jee.faces.Messages;
import de.ivu.elect.jee.faces.UserLocale;
import de.ivu.elect.jee.protokollierung.ProtokollThreadLocal;

@Stateless
public class WahlterminEdit extends AbstractWahlterminEdit {

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

  @Inject
  private transient WahlterminValidator wahlterminValidator;

  @Inject
  private transient FileCleanupEvent fileCleanupEvent;

  @Inject
  private transient MandantExtendedDAO mandantExtendedDAO;

  @Inject
  private transient DokumentVorlageDAO dokumentVorlageDAO;

  @Inject
  private transient SystemLogWriter systemLogWriter;

  @Inject
  private transient Messages messages;

  @Inject
  private transient RolleEdit rolleEdit;

  public WahlterminEdit() {
    super();
  }

  @Override
  public void save(Wahltermin entity) {
    // ELECT-8014
    if (entity.getEinsehenRolle() != null) {
      if (!entity.getEinsehenRolle().isPersistent()) {
        entity.getEinsehenRolle().setMandant(mandantExtendedDAO.attach(entity.getMandant()));
      }
    }

    super.save(entity);

    rolleEdit.updateRolleArtFuerAlleRollen(entity.getMandant());
  }

  @Override
  protected void validate(Wahltermin wahltermin) {
    super.validate(wahltermin);

    wahlterminValidator.validate(wahltermin, extendedDao);
  }

  @Override
  public void delete(Wahltermin entity) {
    Wahltermin attachedEntity = getAttachedEntity(entity);

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

    super.delete(entity);

    fileCleanupEvent.sendEvent();
  }

  @UseCaseSecure(UseCasePermission.WAHLTERMIN_ARCHIVIEREN)
  public void wahlArchivieren(Wahltermin wahltermin) {
    Wahltermin attachedEntity = getAttachedEntity(wahltermin);
    if (attachedEntity.getStatus().isArchivierbar()) {
      attachedEntity.setStatus(WahlterminStatus.ARCHIVIERT);
      for (DokumentVorlage dokumentVorlage : dokumentVorlageDAO.findByWahlterminOrderByArtAndName(attachedEntity)) {
        dokumentVorlage.setAnlageArt(DokumentVorlageAnlageArt.FIXIERT); // ELECT-9074
      }
    }
  }

  @UseCaseSecure(UseCasePermission.WAHLTERMIN_ARCHIVIEREN)
  public void wahlEntarchivieren(Wahltermin wahltermin) {

    Wahltermin attachedEntity = getAttachedEntity(wahltermin);
    if (attachedEntity.getStatus().isArchiviert()) {
      attachedEntity.setStatus(WahlterminStatus.INITIAL);
    }
  }

  @UseCaseSecure(UseCasePermission.WAHLTERMIN_SPERREN)
  public void wahlSperren(Wahltermin wahltermin) {
    Wahltermin attachedEntity = getAttachedEntity(wahltermin);
    if (attachedEntity.getStatus().isSperrbar()) {
      attachedEntity.setStatus(WahlterminStatus.GESPERRT);
    }
  }

  @UseCaseSecure(UseCasePermission.WAHLTERMIN_ENTSPERREN)
  public void wahlEntsperren(Wahltermin wahltermin) {

    Wahltermin attachedEntity = getAttachedEntity(wahltermin);
    if (attachedEntity.getStatus().isGesperrt() || attachedEntity.getStatus().isMigriert()/*ELECT-15026*/) {
      attachedEntity.setStatus(WahlterminStatus.INITIAL);
    }
  }

}
