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

import java.io.Serializable;
import java.util.List;

import javax.ejb.Stateless;
import javax.inject.Inject;

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

import de.ivu.elect.business.mandant.boundary.MandantDAO;
import de.ivu.elect.business.mandant.entity.Mandant;

@Stateless
public class MandantSupportErmittler implements Serializable {

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

  public static final String ELECT_MANDANT_SUPPORT_ENABLED = "ivu.elect.mandant.support.enabled";

  private static final long serialVersionUID = 1L;

  @Inject
  private transient MandantDAO mandantDAO;

  @Inject
  private transient MandantSupportStore mandantSupportStore;

  @Inject
  private transient MandantSupport mandantSupport;

  public void init() {
    LOG.info("Bestimme Unterstützung für Mandanten");

    boolean mandantenUnterstuerzt = mandantSupport.isSystemUnterstuetztMandanten() && mandantSupport.isCustomerUnterstuetztMandanten();
    if (mandantenUnterstuerzt) {

      mandantenUnterstuerzt = isMandantenUnterstuerztSystemProperty();

      List<Mandant> mandantenImSystem = mandantDAO.findByAll();
      if (mandantenUnterstuerzt) {
        for (Mandant mandant : mandantenImSystem) {
          if (mandant.getArt().isOhneMandant()) {
            throw new IllegalStateException(
                "Unterstützung für Mandanten kann nicht aktiviert werden, da bereits 'KEIN_MANDANT' in der Datenbank festgelegt ist.");
          }
        }
      } else {
        LOG.info("Mandanten - System-Parameter nicht gesetzt, prüfe vorhandene Mandanten");
        if (mandantenImSystem.isEmpty()) {
          LOG.info("Keine Mandanten im System vorhanden");
        } else {
          LOG.info("Mandanten im System vorhanden: " + mandantenImSystem);
          for (Mandant mandant : mandantenImSystem) {
            LOG.info("Mandant: " + mandant.getNummer() + ", " + mandant.getArt());
            if (mandant.getArt().isOhneMandant()) {
              mandantenUnterstuerzt = false;
              break;
            }
            if (mandant.getArt().isSystemMandant()) {
              mandantenUnterstuerzt = true;
            }
          }
        }
      }
    } else {
      LOG.info("Keine Unterstützung für Mandanten vorgesehen");
    }

    mandantSupportStore.setMandantUnterstuetzt(mandantenUnterstuerzt);

    LOG.info("Bestimme Unterstützung für Mandanten - done: " + mandantenUnterstuerzt);
  }

  protected boolean isMandantenUnterstuerztSystemProperty() {
    String mandantProperty = System.getProperty(ELECT_MANDANT_SUPPORT_ENABLED, "");
    LOG.info("Mandanten - System-Parameter: " + ELECT_MANDANT_SUPPORT_ENABLED + "=" + mandantProperty);
    return Boolean.TRUE.toString().equalsIgnoreCase(mandantProperty);
  }
}
