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

import java.util.Map;

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

public interface ImportInstanceTracker {

  /**
   * No-Op-Implementierung, weil wir in 90 % der Fälle die Implementierung nicht brauchen.
   */
  ImportInstanceTracker DEAKTIVIERT = new ImportInstanceTracker() {

    @Override
    public void onEntityEingelesen(Entity entityInDatei, Object referenzExtern) {
      // nothing to do
    }

    @Override
    public void onEntitiesPersistiert(Entity... entities) {
      // nothing to do
    }
  };

  default <R, E extends Entity> void onEntitiesEingelesen(Map<R, E> entityInternByReferenzExternMap) {
    if (isAktiviert()) {
      for (Map.Entry<R, E> entry : entityInternByReferenzExternMap.entrySet()) {
        onEntityEingelesen(entry.getValue(), entry.getKey());
      }
    }
  }

  /**
   * Markiert die Entität als (aus einer Datei) eingelesen.
   */
  default void onEntityEingelesen(Entity entityInDatei) {
    onEntityEingelesen(entityInDatei, null);
  }

  /**
   * Markiert die Entität als (aus einer Datei) eingelesen und speichert eine externe Referenz (aus derselben Datei), unter der die Entität später wiedergefunden werden kann.
   */
  void onEntityEingelesen(Entity entityInDatei, Object referenzExtern);

  /**
   * Markiert die Entität als persistiert. Die Entität sollte zuvor als eingelesen markiert worden sein.
   */
  void onEntitiesPersistiert(Entity... entities);

  default boolean isAktiviert() {
    return !DEAKTIVIERT.equals(this);
  }
}
