package de.ivu.elect.jee.protokollierung;

import java.util.Collections;
import java.util.Map;

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

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

public class Eintrag {

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

  private final String entityTechnicalName;

  private final Long id;

  private final ProtokollEintragArt protokollEintragArt;

  private final Map<String, VorherNachherWert> protokollierteAttributeMitWerten;

  private Eintrag(Entity entity, ProtokollEintragArt art, Map<String, VorherNachherWert> protokollierteAttributeMitWerten) {
    this.entityTechnicalName = entity.getEntityTechnicalName();
    this.id = entity.getId();
  // WASDE-526 - Unsinnig  this.tk = entity.getTk();

    this.protokollEintragArt = art;
    this.protokollierteAttributeMitWerten = protokollierteAttributeMitWerten;
  }

  public static void addEintragAnlegenProtokollEintrag(Protokoll protokoll, Entity entity) {
    addEintragInProtokoll(protokoll, new Eintrag(entity, ProtokollEintragArt.ANLEGEN, Collections.emptyMap()));
  }

  public static void addAendernProtokollEintrag(Protokoll protokoll, Entity entity) {
    addAendernProtokollEintrag(protokoll, entity, entity.getProtokollierteAttributeMitWerten());
  }

  public static void addAendernProtokollEintrag(Protokoll protokoll, Entity entity, Map<String, VorherNachherWert> werte) {
    if (!werte.isEmpty()) {
      Eintrag eintrag = new Eintrag(entity, ProtokollEintragArt.AENDERN, werte);
      addEintragInProtokoll(protokoll, eintrag);
    }
  }

  private static void addEintragInProtokoll(Protokoll protokoll, Eintrag eintrag) {
    if (eintrag.getId() == null) {
      // ELECT-9206
      LOG.warn("Eintrag ohne Id: " + eintrag);
    } else {
      protokoll.addEintrag(eintrag);
    }
  }

  public static void addLoeschenProtokollEintrag(Protokoll protokoll, Entity entity) {
    addEintragInProtokoll(protokoll, new Eintrag(entity, ProtokollEintragArt.LOESCHEN, Collections.<String, VorherNachherWert>emptyMap()));
  }

  public String getEntityTechnicalName() {
    return entityTechnicalName;
  }

  public Long getId() {
    return id;
  }

//WASDE-526 - Unsinnig  public EntityTK getTk() {
//WASDE-526 - Unsinnig    return tk;
//WASDE-526 - Unsinnig   }

  public ProtokollEintragArt getProtokollEintragArt() {
    return protokollEintragArt;
  }

  public Map<String, VorherNachherWert> getProtokollierteAttributeMitWerten() {
    return protokollierteAttributeMitWerten;
  }

  @Override
  public String toString() {
    return "Eintrag{" +
        "entityTechnicalName='" + entityTechnicalName + '\'' +
        ", id=" + id +
        // ", tk=" + tk +
        ", protokollEintragArt=" + protokollEintragArt +
        ", protokollierteAttributeMitWerten=" + protokollierteAttributeMitWerten +
        '}';
  }
}
