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

import static org.apache.commons.lang3.StringUtils.isBlank;

import javax.faces.validator.ValidatorException;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

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.jee.faces.BicValidator;
import de.ivu.elect.jee.faces.IbanValidator;

public abstract class AbstractPersonenKontoverbindungKontodatenUngueltigPruefSchritt extends AbstractPersonenPruefSchritt {

  private static final Logger LOG = LoggerFactory.getLogger(AbstractPersonenKontoverbindungKontodatenUngueltigPruefSchritt.class);

  protected AbstractPersonenKontoverbindungKontodatenUngueltigPruefSchritt() {
    super();
  }

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

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

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

  @Override
  public boolean isPotentiellNichtGeeignet(Personendaten personendaten) {
    if (!isIbanValid(personendaten)) {
      return true;
    }

    if (!isBicValid(personendaten)) {
      return true;
    }

    return false;
  }

  public static boolean isIbanValid(Personendaten personendaten) {
    String value = personendaten.getKontoverbindung().getIban();

    if (isBlank(value)) {
      return true;
    }

    IbanValidator ibanValidator = IbanValidator.INSTANCE;

    try {
      ibanValidator.validate(null, null, value);
    } catch (ValidatorException expected) {
      return false;
    } catch (Exception ex) {
      LOG.error("Fehler bei IBAN-Validierung [personendaten = {}, value = {}]", personendaten, value, ex);

      return false;
    }

    return true;
  }

  public static boolean isBicValid(Personendaten personendaten) {
    String value = personendaten.getKontoverbindung().getBic();

    if (isBlank(value)) {
      return true;
    }

    BicValidator bicValidator = BicValidator.INSTANCE;

    try {
      bicValidator.validate(null, null, value);
    } catch (ValidatorException expected) {
      return false;
    } catch (Exception ex) {
      LOG.error("Fehler bei BIC-Validierung [personendaten = {}, value = {}]", personendaten, value, ex);

      return false;
    }

    return true;
  }
}
