
package de.ivu.elect.business.personenregister.boundary;

import de.ivu.elect.business.exchange.control.AbstractWebServiceErreichbarPruefer;
import de.ivu.elect.business.exchange.control.WebServiceStatus;
import de.ivu.elect.business.konfiguration.entity.KonfigurationExtendedLoader;
import de.ivu.elect.business.konfiguration.entity.MandantKonfigurationWerte;
import de.ivu.elect.business.mandant.entity.Mandant;
import de.ivu.elect.business.personenregister.entity.PersonenregisterErreichbarStatus;
import de.ivu.elect.jee.exception.ElectCommonException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import javax.inject.Inject;
import java.util.Collection;
import java.util.UUID;

public abstract class AbstractPersonenregisterErreichbarPruefer extends AbstractWebServiceErreichbarPruefer {

  @Inject
  protected transient KonfigurationExtendedLoader konfigurationExtendedLoader;

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

  public AbstractPersonenregisterErreichbarPruefer() {
    super();
  }

  public PersonenregisterErreichbarStatus getErreichbarStatus(Mandant mandant) {

    try {
      pruefeRequiredKonfigurationVorhanden(mandant);
    } catch (ElectCommonException e) {
      LOG.warn("Personenregister ist nicht vollständig konfiguriert!", e);
      return new PersonenregisterErreichbarStatus(WebServiceStatus.NICHT_KONFIGURIERT, e);
    }

    return getPersonenregisterErreichbarStatus(mandant);
  }

  private PersonenregisterErreichbarStatus getPersonenregisterErreichbarStatus(Mandant mandant) {
    try {
      if (isErreichbarOrThrowException(mandant, UUID.randomUUID())) {
        return new PersonenregisterErreichbarStatus(WebServiceStatus.ERREICHBAR);
      }
      return new PersonenregisterErreichbarStatus(WebServiceStatus.NICHT_ERREICHBAR);
    } catch (Exception ex) {
      LOG.warn("Personenregister nicht erreichbar!", ex);
      return new PersonenregisterErreichbarStatus(WebServiceStatus.NICHT_ERREICHBAR, ex);
    }
  }

  protected void pruefeRequiredKonfigurationVorhanden(Mandant mandant) throws ElectCommonException {
    for (MandantKonfigurationWerte werte : getRequiredKonfigurationWerte()) {
      konfigurationExtendedLoader.resolveRequiredStringValue(mandant, werte);
    }
  }

  protected abstract Collection<MandantKonfigurationWerte> getRequiredKonfigurationWerte();

}
