package de.ivu.elect.jee.protokollierung;

import javax.persistence.PostLoad;
import javax.persistence.PostPersist;
import javax.persistence.PostRemove;
import javax.persistence.PostUpdate;

import de.ivu.elect.jee.entity.Entity;

public class ProtokollEntityListener {

  @PostLoad
  public void postLoad(Object object) {
    if (!ProtokollAktiv.isProtokollierungAktiv()) {
      return;
    }
    Entity entity = (Entity) object;
    entity.resetProtokollierteAttribute();
  }

//  @PostRemove
//  public void postRemove(Object object) {
//    if (!ProtokollAktiv.isProtokollierungAktiv()) {
//      return;
//    }
//    Entity entity = (Entity) object;
//    if (isProtokollierenFuerLoeschenAktiv(entity)) {
//      Eintrag.addLoeschenProtokollEintrag(getProtokoll(), entity);
//    }
//  }

//  private boolean isProtokollierenFuerLoeschenAktiv(Entity entity) {
//    return entity.isAenderungenProtokollieren();
//  }

  @PostPersist
  public void postPersist(Object object) {
    if (!ProtokollAktiv.isProtokollierungAktiv()) {
      return;
    }
    Entity entity = (Entity) object;
    if (isProtokollierenFuerAnlegenAktiv(entity)) {
      Eintrag.addEintragAnlegenProtokollEintrag(getProtokoll(), entity);
    }
  }

  private boolean isProtokollierenFuerAnlegenAktiv(Entity entity) {
    return entity.isAenderungenProtokollieren();
  }

  @PostUpdate
  public void postUpdate(Object object) {
    if (!ProtokollAktiv.isProtokollierungAktiv()) {
      return;
    }
    Entity entity = (Entity) object;
    if (isProtokollierenFuerAenderungenAktiv(entity)) {
      erzeugeAendernEintraege(getProtokoll(), entity);
    }
  }

  protected void erzeugeAendernEintraege(Protokoll protokoll, Entity entity) {
    Eintrag.addAendernProtokollEintrag(protokoll, entity);
  }

  protected boolean isProtokollierenFuerAenderungenAktiv(Entity entity) {
    return entity.isAenderungenProtokollieren();
  }

  protected Protokoll getProtokoll() {
    return ProtokollThreadLocal.getOrCreate();
  }
}
