package de.ivu.elect.business;

import de.ivu.elect.business.mandant.boundary.MandantDAO;
import de.ivu.elect.business.mandant.entity.Mandant;
import de.ivu.elect.business.personenregister.boundary.AbstractPersonenregisterErreichbarPruefer;
import de.ivu.elect.business.personenregister.entity.PersonenregisterErreichbarStatus;
import de.ivu.elect.jee.startup.PostStartupAsync;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import javax.inject.Inject;

public abstract class PersonenregisterPostStartup implements PostStartupAsync {

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

  @Inject
  private transient MandantDAO mandantDAO;

  @Override
  public void postStartup() {
    try {
      for (Mandant mandant : mandantDAO.findByAll()) {
        if (mandant.getArt().isCustomerMandant()) {
          StringBuilder sb = new StringBuilder("Prüfe ")
                  .append(getPersonenregisterName()).append("-Schnittstelle ").append(mandant.getNummer()).append(": ");

          PersonenregisterErreichbarStatus personenregisterErreichbarStatus = getPersonenregistererreichbarPruefer().getErreichbarStatus(mandant);

          if (!personenregisterErreichbarStatus.getWebServiceStatus().isKonfiguriert()) {
            LOG.warn(sb.append("Die Schnittstelle ist nicht konfiguriert").toString());
          } else if (personenregisterErreichbarStatus.getWebServiceStatus().isErreichbar()) {
            LOG.info(sb.append("Die Schnittstelle ist erreichbar").toString());
          } else {
            LOG.error(sb.append("Die Schnittstelle ist NICHT erreichbar! ")
                    .append(getMessage(personenregisterErreichbarStatus.getException())).toString());
          }
        }
      }
    } catch (Exception ex) {
      LOG.error("Fehler beim Prüfen der " + getPersonenregisterName() + "-Schnittstelle", ex);
    }
  }

  private String getMessage(Exception exception) {
    if (exception == null) {
      return "";
    }
    return exception.getMessage();
  }

  protected abstract AbstractPersonenregisterErreichbarPruefer getPersonenregistererreichbarPruefer();

  protected abstract String getPersonenregisterName();
}
