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.DateiImportDAO;
import de.ivu.elect.business.datei.entity.DateiImport;
import de.ivu.elect.business.datei.entity.DateiImportPK;
import de.ivu.elect.business.konfiguration.entity.ElectKonfigurationWerte;
import de.ivu.elect.business.konfiguration.entity.KonfigurationLoader;

public class DateiImportFileCleaner extends AbstractCleaner<DateiImportPK> implements FileCleaner<DateiImportPK> {

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

  @Inject
  private transient DateiImportDAO dateiImportDAO;

  @Inject
  private transient DateiDAO dateiDAO;

  @Inject
  private transient KonfigurationLoader konfigurationLoader;

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

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

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

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

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

    for (var entry : importNachSchluessel.entrySet()) {
      var dateiImportArt = entry.getKey().getDateiImportArt();
      var values = entry.getValue();

      var maxFuerArt = dateiImportArt.overrideMaxEintraege(max);
      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;
  }
}