package de.ivu.elect.exchange.wahl;

import de.ivu.elect.business.system.boundary.SystemLogWriter;
import de.ivu.elect.business.system.entity.SystemLogQuelle;
import de.ivu.elect.business.wahl.entity.WahlPK;
import de.ivu.elect.business.wahl.entity.WahlterminPK;
import de.ivu.elect.jee.faces.Messages;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import javax.ejb.Stateless;
import javax.ejb.TransactionAttribute;
import javax.ejb.TransactionAttributeType;
import javax.inject.Inject;
import java.io.Serializable;
import java.util.List;

@Stateless
@TransactionAttribute(TransactionAttributeType.NOT_SUPPORTED)
public class SystemWahlterminExport implements Serializable {

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

  private static final long serialVersionUID = 1L;

  @Inject
  private transient SystemWahlterminExportTransaktion systemWahlterminExportTransaktion;

  @Inject
  private transient SystemLogWriter systemLogWriter;

  @Inject
  private transient Messages messages;


  public void exportiere() {
    LOG.info("Automatischer Wahltermin-Export");

    SystemWahlterminExportKonfiguration systemWahlterminExportKonfiguration = systemWahlterminExportTransaktion.ladeKonfiguration();
    if (systemWahlterminExportKonfiguration.isAktiviert()) {
      if (systemWahlterminExportKonfiguration.getPath() == null || !systemWahlterminExportKonfiguration.getPath()
          .isDirectory() || systemWahlterminExportKonfiguration.getWahldatum() == null) {
        systemLogWriter.writeWarnLogMessageFuerSystemMandant(messages
            .getMessageForMessageKey("system.wahl.export.konfiguration.fehlerhaft", systemWahlterminExportKonfiguration.getPath(),
                systemWahlterminExportKonfiguration.getWahldatum()), SystemLogQuelle.WAHL_EXPORT);
      } else {

        List<WahlterminPK> wahlterminPKS = systemWahlterminExportTransaktion.bestimmeZuExportierendeWahltermine(systemWahlterminExportKonfiguration);

        List<WahlPK> wahlPKS = systemWahlterminExportTransaktion.bestimmeZuExportierendeWahlen(systemWahlterminExportKonfiguration);

        LOG.info("Zu exportiernde Wahltermine: " + wahlterminPKS);
        LOG.info("Zu exportiernde Wahlen: " + wahlPKS);

        long anzahlExportiert = 0;
        long start = System.currentTimeMillis();

        for (WahlterminPK wahlterminPK : wahlterminPKS) {
          LOG.info("Exportiere Wahltermin: " + wahlterminPK);
          try {
            systemWahlterminExportTransaktion.exportiere(wahlterminPK, systemWahlterminExportKonfiguration);
            anzahlExportiert++;
          } catch (Exception e) {
            logException(wahlterminPK, e);
          }
        }

        for (WahlPK wahlPK : wahlPKS) {
          LOG.info("Exportiere Wahl: " + wahlPK);
          try {
            systemWahlterminExportTransaktion.exportiere(wahlPK, systemWahlterminExportKonfiguration);
            anzahlExportiert++;
          } catch (Exception e) {
            logException(wahlPK, e);
          }
        }

        systemLogWriter.writeInfoLogMessageFuerSystemMandant(
            messages.getMessageForMessageKey("system.wahl.export.done", anzahlExportiert, System.currentTimeMillis() - start), SystemLogQuelle.WAHL_EXPORT);
      }
    } else {
      systemLogWriter.writeInfoLogMessageFuerSystemMandant(messages.getMessageForMessageKey("system.wahl.export.konfiguration.deaktiviert"), SystemLogQuelle.WAHL_EXPORT);
    }
  }

  protected void logException(Object pk, Exception e) {
    systemLogWriter.writeWarnLogMessageFuerSystemMandant(messages.getMessageForMessageKey("system.wahl.export.exception", e.getMessage(), pk), e, SystemLogQuelle.WAHL_EXPORT);
  }
}
