
package de.ivu.elect.business.personenpruefung.boundary.dubletten;

import javax.inject.Inject;

import de.ivu.elect.business.person.boundary.PersonendatenVerknuepfer;
import de.ivu.elect.business.person.entity.Personendaten;
import de.ivu.elect.business.person.entity.VerknuepfungsArt;
import de.ivu.elect.business.person.entity.VerknuepfungsStatus;
import de.ivu.elect.jee.exception.ElectCommonException;

/* Abgeleitete Klassen mit @Stateless annotieren! */
public abstract class AbstractDublettenEdit<E extends Personendaten> {

  @Inject
  private transient PersonendatenVerknuepfer personendatenVerknuepfer;

  public AbstractDublettenEdit() {
    super();
  }

  protected abstract VerknuepfungsArt getVerknuepfungsArt();

  protected abstract E attach(E entity);

  public void loeseAlsVerschieden(DublettenPersonendatenPair<E> entities) {
    loeseAlsVerschiedenAttached(attach(entities.getLeft()), attach(entities.getRight()));
  }

  protected void loeseAlsVerschiedenAttached(E one, E another) {
    loeseAls(VerknuepfungsStatus.VERSCHIEDEN, one, another);
  }

  public void loeseAlsIdentisch(DublettenPersonendatenPair<E> personendatenPair) {
    loeseAlsIdentischAttached(attach(personendatenPair.getLeft()), attach(personendatenPair.getRight()));
  }

  protected void loeseAlsIdentischAttached(E one, E another) {
    loeseAls(VerknuepfungsStatus.IDENTISCH, one, another);
  }

  private void loeseAls(VerknuepfungsStatus status, E one, E another) {
    validateVerknuepfung(one, another, status);
    verknuepfePersonen(one, another, status);
  }

  /**
   * @throws ElectCommonException
   *           wenn es (aus technischen oder fachlichen Gründen) nicht sinnvoll oder verboten wäre, die angegebene Verknüpfung zu persistieren.
   */
  protected abstract void validateVerknuepfung(E one, E another, VerknuepfungsStatus status);

  protected void verknuepfePersonen(E one, E another, VerknuepfungsStatus status) {
    personendatenVerknuepfer.verknuepfeAndPersistManuell(getVerknuepfungsArt(), one, another, status);
  }
}
