package de.ivu.elect.business.system.control;

import javax.annotation.Nullable;
import javax.enterprise.context.ApplicationScoped;
import javax.enterprise.event.Observes;
import javax.enterprise.event.Reception;
import javax.enterprise.inject.Specializes;
import javax.inject.Inject;

import de.ivu.elect.business.konfiguration.entity.ElectKonfigurationWerte;
import de.ivu.elect.business.konfiguration.entity.KonfigurationWertGeaendertEvent;
import de.ivu.elect.jee.memory.MemoryGcKonfiguration;

@Specializes
@ApplicationScoped
public class ElectMemoryGcKonfiguration extends MemoryGcKonfiguration {

  private static final long serialVersionUID = 1L;

  @Inject
  private transient ElectMemoryGcKonfigurationLoader electMemoryGcKonfigurationLoader;

  @Nullable
  private Long maximaleAnzahlEintraege;

  private String crontab;

  private Boolean ausgabenLoggen;

  @Override
  public long getMaximaleAnzahlEintraege() {
    if (maximaleAnzahlEintraege == null) {
      maximaleAnzahlEintraege = electMemoryGcKonfigurationLoader.getMaximaleAnzahlEintraege();
    }
    return maximaleAnzahlEintraege;
  }

  @Override
  public String getCrontab() {
    if (crontab == null) {
      crontab = electMemoryGcKonfigurationLoader.getCrontab();
    }
    return crontab;
  }

  @Override
  public boolean isLoggeAusgaben() {
    if (ausgabenLoggen == null) {
      ausgabenLoggen = electMemoryGcKonfigurationLoader.isAusgabenLoggen();
    }
    return ausgabenLoggen;
  }

  public void listen(@Observes(notifyObserver = Reception.ALWAYS) KonfigurationWertGeaendertEvent konfigurationWertGeaendertEvent) {
    if (ElectKonfigurationWerte.MEMORY_GC_ANZAHL_EINTRAEGE.equals(konfigurationWertGeaendertEvent.getKey()) ||
        ElectKonfigurationWerte.MEMORY_GC_CRONTAB.equals(konfigurationWertGeaendertEvent.getKey()) ||
        ElectKonfigurationWerte.MEMORY_GC_LOGGING_ENABLED.equals(konfigurationWertGeaendertEvent.getKey())) {
      reset();
    }

  }

  public void reset() {
    maximaleAnzahlEintraege = null;
    String crontab = null;
    Boolean ausgabenLoggen = null;
  }
}
