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

import java.io.File;
import java.util.List;
import java.util.Set;
import java.util.stream.Collectors;

import javax.inject.Inject;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import de.ivu.elect.business.datei.boundary.DateiDAO;
import de.ivu.elect.business.datei.boundary.DateiImportDAO;
import de.ivu.elect.business.datei.entity.Datei;
import de.ivu.elect.business.datei.entity.DateiImport;
import de.ivu.elect.business.dokumente.boundary.DokumentVorlageDAO;
import de.ivu.elect.business.dokumente.entity.DokumentVorlage;
import de.ivu.elect.business.exchange.entity.DateiImportArt;

public class DokumentTemplatesFileCleanupStrategie implements FileCleanupStrategy {

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

  @Inject
  private transient DokumentVorlageDAO dokumentVorlageDAO;

  @Inject
  private transient DateiImportDAO dateiImportDAO;

  @Inject
  private transient DateiDAO dateiDAO;

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

  @Override
  public void bereinige(File verzeichnis) throws Exception {
    loesche(finde());
  }

  private void loesche(List<DateiImport> zuLoeschen) {
    for (DateiImport dateiImport : zuLoeschen) {
      LOG.info("Bereinige: " + dateiImport.getDateiArt() + ", wahltermin: " + dateiImport.getDatei().getWahltermin() + ", wahl: " + dateiImport.getDatei()
          .getWahl());
      Datei datei = dateiImport.getDatei();
      dateiImportDAO.remove(dateiImport);
      dateiDAO.remove(datei);
    }
  }

  private List<DateiImport> finde() {
    Set<DateiImport> dateiImporteDokumentvorlage = dokumentVorlageDAO.findByAll().stream().map(DokumentVorlage::getDateiImport).collect(Collectors.toSet());

    return dateiImportDAO.findByDateiImportArt(DateiImportArt.DOKUMENT_VORLAGE).stream()
        .filter(dateiImport -> !dateiImporteDokumentvorlage.contains(dateiImport)).collect(Collectors.toList());

  }

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