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

import java.io.File;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.stream.Collectors;

import javax.annotation.Nullable;
import javax.inject.Inject;

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

import de.ivu.elect.business.datei.boundary.DateiDAO;
import de.ivu.elect.business.datei.boundary.DateiExportDAO;
import de.ivu.elect.business.datei.entity.DateiExport;
import de.ivu.elect.business.datei.entity.DateiExportPK;
import de.ivu.elect.business.konfiguration.entity.ElectKonfigurationWerte;
import de.ivu.elect.business.konfiguration.entity.KonfigurationLoader;

public class DateiExportFileCleaner extends AbstractCleaner<DateiExportPK> implements FileCleaner<DateiExportPK> {

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

  @Inject
  private transient DateiExportDAO dateiExportDAO;

  @Inject
  private transient DateiDAO dateiDAO;

  @Inject
  private transient KonfigurationLoader konfigurationLoader;

  @Override
  public void bereinige(File verzeichnis, FileCleanerBucket<DateiExportPK> bucket) throws Exception {
    var dateiExport = dateiExportDAO.findByPrimaryKey(bucket.getBucket());
    LOG.info("Bereinige: " + dateiExport.getDateiArt() + ", wahltermin: " + dateiExport.getDatei().getWahltermin() + ", wahl: " + dateiExport.getDatei()
        .getWahl() + ", " + dateiExport.getDatei().getDateiname());
    var datei = dateiExport.getDatei();
    dateiExportDAO.remove(dateiExport);
    dateiDAO.remove(datei);
  }

  @Override
  public List<FileCleanerBucket<DateiExportPK>> getBuckets(File verzeichnis) throws Exception {
    return finde().stream().map(dateiExport -> new FileCleanerBucket<>(dateiExport.getPk())).collect(Collectors.toList());
  }

  private List<DateiExport> finde() {
    var max = parse(konfigurationLoader.resolveStringValue(ElectKonfigurationWerte.ELECT_COMMON_DATEI_CLEANUP_MAX_EXPORT_COUNT));
    if (max == null) {
      return Collections.emptyList(); // nicht gesetzt
    }

    List<DateiExport> result = new ArrayList<>();

    var importNachSchluessel = dateiExportDAO.findByAll().stream()
        .filter(de -> de != null && de.getDatei() != null && de.getDateiArt() != null /*ELECTKOM-2035*/)
        .collect(Collectors.groupingBy(DateiExportCleanupSchluessel::new));

    for (var entry : importNachSchluessel.entrySet()) {
      var dateiExportArt = entry.getKey().getDateiExportArt();
      var values = entry.getValue();

      var maxFuerArt = dateiExportArt.overrideMaxEintraege(max, konfigurationLoader);
      if (maxFuerArt != null && values.size() > maxFuerArt) {

        values.sort((v, u) -> u.getDatei().getErstellungszeitpunkt().compareTo(v.getDatei().getErstellungszeitpunkt())); // neuste zuerst

        for (int pos = maxFuerArt; pos < values.size(); pos++) {
          result.add(values.get(pos));
        }
      }

    }

    return result;
  }

  @Nullable
  private Integer parse(String value) {
    if (StringUtils.isBlank(value)) {
      return null;
    }
    try {
      return Integer.parseInt(value);
    } catch (Exception e) {
      return null;
    }

  }

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