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

import java.util.HashMap;
import java.util.Map;
import java.util.Map.Entry;

import de.ivu.elect.business.entschaedigung.entity.Entschaedigung;
import de.ivu.elect.business.entschaedigung.entity.EntschaedigungConstants;
import de.ivu.elect.business.entschaedigung.entity.EntschaedigungsartTemplate;
import de.ivu.elect.business.person.entity.Personendaten;
import de.ivu.elect.jee.protokollierung.Eintrag;
import de.ivu.elect.jee.protokollierung.ProtokollThreadLocal;
import de.ivu.elect.jee.protokollierung.VorherNachherWert;

public class EntschaedigungProtokollierung {

  private static final String PROTOKOLL_ATTRIBUTE_MSG_KEY_PREFIX = "entschaedigung.protokollierung.";

  private EntschaedigungProtokollierung() {
    super();
  }

  public static void protokolliere(Entschaedigung entschaedigung) {
    if (entschaedigung.hasPersonendaten()) {
      Map<String, VorherNachherWert> vorherNachherWertPerAttributeMsgKey = new HashMap<>();

      for (Entry<String, VorherNachherWert> entry : entschaedigung.getProtokollierteAttributeMitWerten().entrySet()) {
        String attributeMsgKey = entry.getKey();

        vorherNachherWertPerAttributeMsgKey.put(PROTOKOLL_ATTRIBUTE_MSG_KEY_PREFIX + attributeMsgKey, fixUndefinedInitialWertVorherToDefault(entschaedigung, attributeMsgKey, entry.getValue()));
      }

      addProtokollEintrag(entschaedigung.getPersonendaten(), vorherNachherWertPerAttributeMsgKey);
    }
  }

  private static void addProtokollEintrag(Personendaten personendaten, Map<String, VorherNachherWert> vorherNachherWertPerAttributeMsgKey) {
    Eintrag.addAendernProtokollEintrag(ProtokollThreadLocal.getOrCreate(), personendaten, vorherNachherWertPerAttributeMsgKey);
  }

  protected static VorherNachherWert fixUndefinedInitialWertVorherToDefault(Entschaedigung entschaedigung, String attributeMsgKey, VorherNachherWert vorherNachherWert) {
    Map<String, Object> defaultPerAttributeMsgKey = new HashMap<>();
    defaultPerAttributeMsgKey.put(EntschaedigungConstants.MESSAGE_KEY_ANZAHL_EINZAHL, entschaedigung.getAnzahlDefault());
    defaultPerAttributeMsgKey.put(EntschaedigungConstants.MESSAGE_KEY_EINZELBETRAG_EINZAHL, entschaedigung.getEinzelbetragDefault());
    defaultPerAttributeMsgKey.put(EntschaedigungConstants.MESSAGE_KEY_WAEHRUNG_EINZAHL, EntschaedigungsartTemplate.DEFAULT_WAEHRUNG.getCurrencyCode());

    Object attributeWertVorher = vorherNachherWert.getVorher();

    if (attributeWertVorher == null) {
      attributeWertVorher = defaultPerAttributeMsgKey.getOrDefault(attributeMsgKey, attributeWertVorher);
    }

    return new VorherNachherWert(vorherNachherWert.getTyp(), attributeWertVorher, vorherNachherWert.getNachher());
  }
}
