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

import java.io.File;
import java.io.Serializable;

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

import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import de.ivu.elect.business.exchange.control.ImportExportKonfiguration;
import de.ivu.elect.business.konfiguration.entity.ElectKonfigurationWerte;
import de.ivu.elect.business.konfiguration.entity.KonfigurationLoader;
import de.ivu.elect.business.system.boundary.CacheResetSession;
import de.ivu.elect.business.system.control.files.strategies.FileCleanupStrategy;
import de.ivu.elect.business.system.control.files.strategies.FileCleanupStrategyFinder;

@Stateless
public class FileCleanup implements Serializable {

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

  private static final long serialVersionUID = 1L;

  @Inject
  private transient ImportExportKonfiguration importExportKonfiguration;

  @Inject
  private transient FileCleanupStrategyFinder fileCleanupStrategyFinder;

  @Inject
  private transient KonfigurationLoader konfigurationLoader;

  @Inject
  private transient CacheResetSession cacheResetSession;

  public boolean isEtwasZuBereinigen() {
    return isDateibereinugungAktiviert() && isServerVerzeichnisVerfuegbar() && isInStrategyEtwasZuBereinigen();
  }

  private boolean isDateibereinugungAktiviert() {
    boolean aktiviert = konfigurationLoader.resolveBooleanValue(ElectKonfigurationWerte.ELECT_COMMON_DATEI_CLEANUP_AKTIVIERT);
    if (!aktiviert) {
      LOG.info("Dateibereinigung ist deaktiviert");
    }
    return aktiviert;
  }

  private boolean isInStrategyEtwasZuBereinigen() {
    File serverVerzeichnis = getServerVerzeichnis();
    return fileCleanupStrategyFinder.getCleanupStrategies().stream()
        .anyMatch(fileCleanupStrategy -> {
          try {
            boolean dirtyFilePresent = fileCleanupStrategy.isDirtyFilePresent(serverVerzeichnis);
            LOG.info("fileCleanupStrategy = " + fileCleanupStrategy.getName() + ": " + dirtyFilePresent);
            return dirtyFilePresent;
          } catch (Exception e) {
            throw new RuntimeException(fileCleanupStrategy.getName() + "-" + e.getMessage(), e);
          }
        });
  }

  public void bereinige() {
    if (isDateibereinugungAktiviert()) {
      File serverVerzeichnis = getServerVerzeichnis();
      for (FileCleanupStrategy fileCleanupStrategy : fileCleanupStrategyFinder.getCleanupStrategies()) {
        try {
          if (fileCleanupStrategy.isDirtyFilePresent(serverVerzeichnis)) {
            LOG.info("Bereinige: " + fileCleanupStrategy.getName());
            fileCleanupStrategy.bereinige(serverVerzeichnis);
            LOG.info("Bereinige: " + fileCleanupStrategy.getName() + " - done");

            cacheLoeschen();

            return; // nur ein Aufruf pro Durchgang
          }
        } catch (Exception e) {
          throw new RuntimeException(fileCleanupStrategy.getName() + "-" + e.getMessage(), e);
        }
      }
      LOG.info("Bereinige - done");
    }
  }

  private void cacheLoeschen() {
    cacheResetSession.resetCache();
  }

  private boolean isServerVerzeichnisVerfuegbar() {
    String serverVerzeichnisAsString = importExportKonfiguration.getServerVerzeichnis();
    return StringUtils.isNotBlank(serverVerzeichnisAsString) && new File(serverVerzeichnisAsString).isDirectory();
  }

  private File getServerVerzeichnis() {
    return new File(importExportKonfiguration.getServerVerzeichnis());
  }

}
