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

import static java.util.Objects.nonNull;

import java.io.File;
import java.nio.file.Files;
import java.util.Arrays;
import java.util.Collections;
import java.util.Date;
import java.util.List;
import java.util.stream.Collectors;

import org.apache.commons.lang3.time.DateUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class PapierkorbAufbewahrungAbgelaufenFileCleanupStrategy extends AbstractFileCleanupStrategy {

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

  @Override
  protected Logger getLog() {
    return LOG;
  }

  @Override
  public boolean isDirtyFilePresent(File verzeichnis) throws Exception {
    return !getFilesAbgelaufen(verzeichnis).isEmpty();
  }

  @Override
  public void bereinige(File verzeichnis) throws Exception {
    for (File file : getFilesAbgelaufen(verzeichnis)) {
      try {
        Files.deleteIfExists(file.toPath());
        LOG.info("Datei '" + file.getAbsolutePath() + "' aus dem Papierkorb gelöscht.");
      } catch (Exception e) {
        LOG.warn("Fehler beim Löschen der Datei '" + file.getAbsolutePath() + "' aus dem Papierkorb.", e);
      }
    }
  }

  @Override
  public String getName() {
    return PapierkorbAufbewahrungAbgelaufenFileCleanupStrategy.class.getName();
  }

  private List<File> getFilesAbgelaufen(File verzeichnis) {
    Integer daysInRecycleBin = getDaysInRecycleBin();
    if (nonNull(daysInRecycleBin)) {
      long millisToDeleteFile = getMillisToDeleteFile(daysInRecycleBin);
      File recycleBinVerzeichnis = getRecyclebin(verzeichnis);
      if (recycleBinVerzeichnis.isDirectory()) {
        return Arrays.stream(recycleBinVerzeichnis.listFiles()).filter(file -> {
          try {
            return file.lastModified() < millisToDeleteFile;
          } catch (SecurityException e) {
            LOG.warn("Fehler beim Prüfen der Datei '" + file.getAbsolutePath() + "' im Papierkorb.");
          }
          return false;
        }).collect(Collectors.toList());
      }
    }
    return Collections.emptyList();
  }

  private long getMillisToDeleteFile(Integer daysInRecycleBin) {
    return DateUtils.addDays(new Date(), -daysInRecycleBin).getTime();
  }
}
