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

import java.util.List;

import de.ivu.elect.business.ElectSystemProperties;
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;

public abstract class AbstractPersonenKontoverbindungMehrfachAngegebenPruefSchritt extends AbstractPersonenPruefSchritt {

  protected static final String PERSONENDATEN_BY_KONTOVERBINDUNG_LIMIT_PROPERTY_NAME = ElectSystemProperties.PERSONENDATEN_BY_KONTOVERBINDUNG_LIMIT_PROPERTY_NAME;

  public AbstractPersonenKontoverbindungMehrfachAngegebenPruefSchritt() {
    super();
  }

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

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

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

  @Override
  public boolean isPotentiellNichtGeeignet(Personendaten personendaten) {
    return findPersonendatenByKontoverbindung(personendaten).size() > getPersonendatenByKontoverbindungLimit();
  }

  protected int getPersonendatenByKontoverbindungLimit() {
    int propertyValue = 0;

    try {
      // NOTE ELECT-4806, dass dies nur eine Quick 'n Dirty Umsetzung sein soll!
      propertyValue = Integer.parseInt(System.getProperty(PERSONENDATEN_BY_KONTOVERBINDUNG_LIMIT_PROPERTY_NAME));
    } catch (Exception ignored) {
    }

    // Cf. ELECTMUC-1133
    return Math.max(3, propertyValue);
  }

  protected abstract List<Personendaten> findPersonendatenByKontoverbindung(Personendaten personendaten);
}
