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

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.stream.Collectors;

import javax.ejb.Stateless;
import javax.ejb.TransactionAttribute;
import javax.ejb.TransactionAttributeType;
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;
import de.ivu.elect.business.mandant.entity.MandantPK;
import de.ivu.elect.business.system.boundary.SystemLogWriter;
import de.ivu.elect.business.system.entity.SystemLogQuelle;

@Stateless
@TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)
public class MandantBackgroundServiceHelper {

  private static final Logger LOG = LoggerFactory.getLogger(MandantBackgroundServiceHelper.class);
  @Inject
  private transient MandantDAO mandantDAO;

  @Inject
  private transient SystemLogWriter systemLogWriter;

  public List<MandantPK> getMandanten() {
    List<Mandant> mandanten = new ArrayList<>(mandantDAO.findByAll());
    Collections.shuffle(mandanten); // immer schön zufällig => fair
    return mandanten.stream().filter(m -> m.getStatus().isAktiv()).map(Mandant::getPk).collect(Collectors.toList());
  }

  public Mandant getMandant(MandantPK mandantPK) {
    return mandantDAO.findByPrimaryKey(mandantPK);
  }

  /**
   * ELECT-8885
   */
  public void systemLogExcpetionFuerKundenMandant(MandantPK mandantPK, Exception exception, SystemLogQuelle systemLogQuelle) {
    try {
      Mandant mandant = mandantDAO.findByPrimaryKey(mandantPK);
      if (!mandant.getArt().isSystemMandant()) {
        systemLogWriter.writeErrorLogMessageFuerMandant(mandant, "Fehler in Hintergrundprozess", exception, systemLogQuelle);
      }
    } catch (Exception e) {
      LOG.error("Fehler beim Loggen der Exception: ", e);
      LOG.error("Fehler beim Loggen von Quelle: " + systemLogQuelle + ", fuer Mandant: " + mandantPK + ", der folgenden Exception: " + exception.getMessage(),
          exception);
    }

  }
}
