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

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

import java.util.List;
import java.util.concurrent.ConcurrentHashMap;

import javax.enterprise.context.ApplicationScoped;
import javax.inject.Inject;

import org.iban4j.IbanFormatException;
import org.iban4j.IbanUtilDE;
import org.iban4j.InvalidCheckDigitException;
import org.iban4j.UnsupportedCountryException;

import de.ivu.elect.business.person.boundary.KreditinstitutDAO;
import de.ivu.elect.business.person.entity.Kreditinstitut;

@ApplicationScoped
public class KreditinstitutErmittler {

  @Inject
  private transient KreditinstitutDAO kreditinstitutDAO;

  private ConcurrentHashMap<String, Kreditinstitut> bankleitzahlMap = null;

  public Kreditinstitut fromIban(String iban) {
    if (isNotBlank(iban)) {
      try {
        IbanUtilDE.validate(iban);
        String bankleitzahl = IbanUtilDE.getBankleitzahl(iban);
        if (isNotBlank(bankleitzahl)) {
          return getBankleitzahlMap().get(bankleitzahl);
        }
      } catch (IbanFormatException e) {
        // nichts tun
      } catch (InvalidCheckDigitException e) {
        // nichts tun
      } catch (UnsupportedCountryException e) {
        // nichts tun
      }
    }
    return null;
  }

  public boolean isErmittlungAktiv() {
    return !getBankleitzahlMap().isEmpty();
  }

  ConcurrentHashMap<String, Kreditinstitut> getBankleitzahlMap() {
    if (bankleitzahlMap == null) {
      List<Kreditinstitut> alleKreditinstitute = kreditinstitutDAO.findByAll();
      bankleitzahlMap = new ConcurrentHashMap<>(alleKreditinstitute.size());
      for (Kreditinstitut kreditinstitut : alleKreditinstitute) {
        bankleitzahlMap.put(kreditinstitut.getBankleitzahl(), kreditinstitut);
      }
    }
    return bankleitzahlMap;
  }
}
