
package de.ivu.elect.business.personenpruefung.control.wertelisten;

import java.util.Collection;

import javax.inject.Inject;

import de.ivu.elect.business.person.boundary.BerufDAO;
import de.ivu.elect.business.person.entity.Beruf;
import de.ivu.elect.business.person.entity.Personendaten;
import de.ivu.elect.business.personenpruefung.control.AbstractPersonenPruefSchritt;
import de.ivu.elect.business.personenpruefung.entity.PersonenKonfliktArt;
import de.ivu.elect.business.personenpruefung.entity.PersonenKonfliktStatus;
import de.ivu.elect.business.wertelisten.boundary.WertelistenDAO;
import de.ivu.elect.business.wertelisten.entity.Wertelisten;

public abstract class AbstractPersonenWertelistenAbgleichPruefSchritt extends AbstractPersonenPruefSchritt {

  @Inject
  private BerufDAO berufDao;

  @Inject
  private WertelistenDAO wertelistenDao;

  @Inject
  private PersonendatenWertelistenAbgleichFinder wertelistenFinder;

  @Inject
  private PersonendatenWertelistenAbgleichMatcher matcher;

  public AbstractPersonenWertelistenAbgleichPruefSchritt() {
    super();
  }

  @Override
  public boolean isInstantPersonenPruefSchritt() {
    return true;
  }

  @Override
  public PersonenKonfliktArt getPersonenKonfliktArt() {
    return PersonenKonfliktArt.WERTELISTEN_ABGLEICH_FEHLGESCHLAGEN;
  }

  @Override
  public PersonenKonfliktStatus getPersonenKonfliktStatus() {
    return PersonenKonfliktStatus.MANUELL_ZU_PRUEFEN;
  }

  @Override
  public boolean isPotentiellNichtGeeignet(Personendaten personendaten) {
    return !getMatcher(personendaten).matches(getBerufe(personendaten), getWertelisten(personendaten), personendaten);
  }

  private PersonendatenWertelistenAbgleichMatcher getMatcher(Personendaten personendaten) {
    return matcher;
  }

  /*
   * Hinweis: Nicht in lokaler Variable cachen, da sonst Änderungen an Berufen nicht erkannt werden.
   */
  protected Collection<Beruf> getBerufe(Personendaten personendaten) {
    return wertelistenFinder.getBerufe(berufDao);
  }

  /*
   * Hinweis: Nicht in lokaler Variable cachen, da sonst Änderungen an Wertelisten nicht erkannt werden.
   */
  protected Collection<Wertelisten> getWertelisten(Personendaten personendaten) {
    return wertelistenFinder.getWertelisten(wertelistenDao, personendaten);
  }
}
