
package de.ivu.elect.business.protokollierung.entity;

import java.io.Serializable;
import java.util.Arrays;
import java.util.Date;

import javax.annotation.Nullable;
import javax.enterprise.event.Event;
import javax.inject.Inject;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import de.ivu.elect.business.wahl.entity.Wahl;
import de.ivu.elect.business.wahl.entity.Wahltermin;
import de.ivu.elect.jee.entity.Entity;
import de.ivu.elect.jee.protokollierung.ProtokollThreadLocal;

public class LoeschProtokollEvent implements Serializable {

  private static final Logger LOG = LoggerFactory.getLogger(LoeschProtokollEvent.class);

  private static final long serialVersionUID = 1L;

  @Inject
  private transient Event<LoeschProtokollEvent> event;

  private LoeschProtokoll loeschProtokoll;

  private LoeschProtokollEvent() {
    super();
  }

  private LoeschProtokollEvent(LoeschProtokoll loeschProtokoll) {
    this.loeschProtokoll = loeschProtokoll;
  }

  public LoeschProtokoll getLoeschProtokoll() {
    return loeschProtokoll;
  }

  public void sendeLoeschProtokollEvent(Wahl wahl, Entity< ? , ? > entity, String messageKey, String... messageParams) {
    if (wahl != null) {
      sendeLoeschProtokollEvent(wahl.getWahltermin(), wahl, entity, messageKey, messageParams);
    }
  }

  public void sendeLoeschProtokollEvent(Wahltermin wahltermin, Entity< ? , ? > entity, String messageKey, String... messageParams) {
    sendeLoeschProtokollEvent(wahltermin, null, entity, messageKey, messageParams);
  }

  public void sendeLoeschProtokollEvent(Wahltermin wahltermin, @Nullable Wahl wahl, Entity< ? , ? > entity, String messageKey, String... messageParams) {
    String benutzerKennung = ProtokollThreadLocal.getBenutzerKennung();

    LOG.info("wahltermin = " + wahltermin + ", wahl = " + wahl + ", entity = " + entity + ", messageKey = " + messageKey + ", messageParams = " + Arrays.toString(messageParams)
        + ", benutzerKennung = " + benutzerKennung);

    createAndFireLoeschProtokollEvent(wahltermin, wahl, benutzerKennung, entity == null ? null : entity.getId(), entity == null ? null : entity.getEntityTechnicalName(), messageKey, messageParams);
  }

  public void sendeLoeschProtokollEvent(Wahltermin wahltermin, @Nullable Wahl wahl, Long entityId, String entityTechnicalName, String messageKey, String... messageParams) {
    String benutzerKennung = ProtokollThreadLocal.getBenutzerKennung();

    LOG.info("wahltermin = " + wahltermin + ", wahl = " + wahl + ", entityId = " + entityId + ", entityTechnicalName = " + entityTechnicalName + ", messageKey = " + messageKey + ", messageParams = "
        + Arrays.toString(messageParams) + ", benutzerKennung = " + benutzerKennung);

    createAndFireLoeschProtokollEvent(wahltermin, wahl, benutzerKennung, entityId, entityTechnicalName, messageKey, messageParams);
  }

  private void createAndFireLoeschProtokollEvent(Wahltermin wahltermin, @Nullable Wahl wahl, String benutzerKennung, Long entityId, String entityTechnicalName, String messageKey,
      String... messageParams) {
    LoeschProtokoll loeschProtokoll = new LoeschProtokoll();
    loeschProtokoll.setWahltermin(wahltermin);
    loeschProtokoll.setWahl(wahl);
    loeschProtokoll.setZeitpunkt(new Date());
    loeschProtokoll.setBenutzerkennung(benutzerKennung);
    loeschProtokoll.setEntitaet(entityTechnicalName);
    loeschProtokoll.setPrimaerschluessel(entityId);
    loeschProtokoll.setMessageKey(messageKey);

    if (messageParams != null && messageParams.length > 0) {
      loeschProtokoll.setMessageParams(String.join(AbstractLoeschProtokoll.MESSAGE_PARAMS_SEPARATOR, messageParams));
    }

    event.fire(new LoeschProtokollEvent(loeschProtokoll));
  }
}
