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

import java.util.Map;

import javax.inject.Inject;

import de.ivu.elect.business.entschaedigung.boundary.AuszahlungDAO;
import de.ivu.elect.business.entschaedigung.entity.Auszahlung;
import de.ivu.elect.business.entschaedigung.entity.AuszahlungPK;
import de.ivu.elect.business.entschaedigung.entity.Entschaedigung;
import de.ivu.elect.business.entschaedigung.entity.Entschaedigungsart;
import de.ivu.elect.business.exchange.control.AbstractImportAttacher;
import de.ivu.elect.business.exchange.control.ContextMitImportInstanceTracker;
import de.ivu.elect.business.exchange.control.DefaultImportInstanceTracker;
import de.ivu.elect.business.person.entity.Personendaten;

public class EntschaedigungImportAttacher extends AbstractImportAttacher {

  @Inject
  private AuszahlungDAO auszahlungDAO;

  public void prepareContext(ContextMitImportInstanceTracker context) {
    context.setImportInstanceTracker(new DefaultImportInstanceTracker());
  }

  public void attachPersonendaten(Entschaedigung entschaedigung, EntschaedigungExchangeContext context) {

    Personendaten personendaten = entschaedigung.getPersonendaten();
    Entschaedigungsart entschaedigungsart = entschaedigung.getEntschaedigungsart();
    if (entschaedigungsart == null) {
      throw new IllegalStateException(
          "Entschädigung mit Personendaten, aber ohne Entschädigungsart: " + entschaedigung);
    }

    try {
      attachPersonendatenIntern(entschaedigung, entschaedigungsart, personendaten, context);
    } catch (Exception ex) {
      throw new IllegalArgumentException("Person kann nicht gefunden werden für Entschädigung " + entschaedigung, ex);
    }

  }

  protected void attachPersonendatenIntern(Entschaedigung entschaedigung, Entschaedigungsart entschaedigungsart,
      Personendaten personendaten, EntschaedigungExchangeContext context) {

    // HINT: Je nach Modul (WAS/WOS/WUS) überschreiben
    throw new IllegalStateException(
        "Kann Personendaten zu Entschaedigung " + entschaedigung + " und Entschädigungsart " + entschaedigungsart
            + " nicht finden: " + personendaten);

  }

  public void attachAuszahlung(Entschaedigung inDatei, EntschaedigungExchangeContext context) {

    try {
      DefaultImportInstanceTracker instanceTracker = getInstanceTracker(context);
      inDatei.setAuszahlung(findAuszahlungInDb(inDatei, instanceTracker));
    } catch (Exception ex) {
      throw new IllegalArgumentException("Auszahlung kann nicht gefunden werden für Entschädigung " + inDatei, ex);
    }

  }

  public <R> void onAuszahlungEingelesen(Map<R, Auszahlung> auszahlungByReferenzMap,
      ContextMitImportInstanceTracker context) {
    getAnyInstanceTracker(context).onEntitiesEingelesen(auszahlungByReferenzMap);
  }

  public void onAuszahlungPersistiert(Auszahlung auszahlung, ContextMitImportInstanceTracker context) {
    getAnyInstanceTracker(context).onEntitiesPersistiert(auszahlung);
  }

  private Auszahlung findAuszahlungInDb(Entschaedigung inDatei, DefaultImportInstanceTracker instanceTracker) {
    AuszahlungPK pk = instanceTracker.getEntityPK(inDatei.getAuszahlung(), AuszahlungPK.class);
    return auszahlungDAO.findByPrimaryKey(pk);
  }
}
