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

import java.util.Collection;

import javax.inject.Inject;

import de.ivu.elect.business.exchange.control.AbstractImportAttacher;
import de.ivu.elect.business.exchange.control.ContextMitImportInstanceTracker;
import de.ivu.elect.business.exchange.control.ImportInstanceTracker;
import de.ivu.elect.business.person.boundary.PersonendatenDAO;
import de.ivu.elect.business.person.entity.Personendaten;
import de.ivu.elect.business.person.entity.PersonendatenPK;
import de.ivu.elect.business.veranstaltung.entity.Teilnahme;

public class TeilnahmeImportAttacher extends AbstractImportAttacher {

  @Inject
  private PersonendatenDAO personendatenDAO;

  public boolean isTeilnehmerPersistiert(Teilnahme teilnahmeInDatei, ContextMitImportInstanceTracker context) {
    if (context.getImportInstanceTracker().isAktiviert()) {
      return getInstanceTracker(context).isEntityPersistiert(teilnahmeInDatei, PersonendatenPK.class);
    }

    return false;
  }

  public Personendaten attachTeilnehmer(Teilnahme teilnahme, ContextMitImportInstanceTracker context) {
    // HINT: der Teilnehmer wird mit einer PersonendatenReferenz eingelesen; die Personendaten werden mit der
    //   PersonendatenReferenz persistiert, daher finden wir nun zur Teilnahme auch die persistenten Personendaten
    PersonendatenPK personendatenPK = getInstanceTracker(context).getEntityPK(teilnahme, PersonendatenPK.class);
    return personendatenDAO.findByPrimaryKey(personendatenPK);
  }

  public void onTeilnehmerPersistiert(Teilnahme teilnahme, ContextMitImportInstanceTracker context) {
    getAnyInstanceTracker(context).onEntitiesPersistiert(teilnahme);
  }

  public <R> void onTeilnehmerEingelesen(Collection<Teilnahme> teilnahmen, R personendatenReferenz, ContextMitImportInstanceTracker context) {
    ImportInstanceTracker instanceTracker = getAnyInstanceTracker(context);
    teilnahmen.forEach(teilnahme -> instanceTracker.onEntityEingelesen(teilnahme, personendatenReferenz));
  }

  /**
   * HINT: Wir befinden uns in der Validierungsphase eines Importes. Der zugehörige Teilnehmer wird im selben Import
   * erst angelegt. Er wurde als "eingelesen" markiert, damit wir in der Validierung wissen, dass er auch persistiert
   * wird.
   */
  public boolean isTeilnahmeEingelesen(Teilnahme teilnahmeInDatei, ContextMitImportInstanceTracker context) {
    if (isTeilnehmerPersistiert(teilnahmeInDatei, context)) {
      return true;
    }

    if (context.getImportInstanceTracker().isAktiviert()) {
      // HINT: Eingelesen, aber noch nicht persistiert
      return getInstanceTracker(context).isEntityEingelesen(teilnahmeInDatei);
    }

    return false;
  }

  public void onTeilnahmeEingelesen(Collection<Teilnahme> teilnahmeCollection, ContextMitImportInstanceTracker context) {
    ImportInstanceTracker instanceTracker = getAnyInstanceTracker(context);
    teilnahmeCollection.forEach(instanceTracker::onEntityEingelesen);
  }
}
