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

import org.apache.commons.io.FileUtils;
import org.apache.commons.io.filefilter.FalseFileFilter;
import org.apache.commons.io.filefilter.TrueFileFilter;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.io.File;
import java.util.List;

import static java.util.stream.Collectors.toList;

public class LeereVerzeichnisseLoeschenFileCleanupStrategy extends AbstractFileCleanupStrategy implements FileCleanupStrategy {

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

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

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

  @Override
  public void bereinige(File verzeichnis) throws Exception {
    for (File directory : getLeereVerzeichnisse(verzeichnis)) {
      FileUtils.deleteDirectory(directory);
      getLog().info("Verzeichnis gelöscht: " + directory.getAbsolutePath());
    }
  }

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

  private List<File> getLeereVerzeichnisse(File verzeichnis) {
    return FileUtils.listFilesAndDirs(verzeichnis, FalseFileFilter.INSTANCE, TrueFileFilter.INSTANCE).stream()
        .filter(File::isDirectory)
        .filter(f->!verzeichnis.equals(f)) // ELECTMUC-2233
        .filter(f -> !isInRecycleBin(f))
        .filter(f -> {
          File[] files = f.listFiles();
          return files == null || files.length == 0;
        }).collect(toList());
  }

}
