
package de.ivu.elect.business.exchange.entity;

import java.io.File;
import java.io.IOException;
import java.io.Serializable;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import java.util.function.Function;

import javax.annotation.Nullable;

import org.apache.commons.lang3.StringUtils;

import de.ivu.elect.business.system.entity.SystemLogQuelle;
import de.ivu.elect.business.wahl.entity.WahlParameterWerte;
import de.ivu.elect.util.FileUtil;

/**
 *  on 04.01.2017.
 */
public class DateienImportierenBackgroundServiceContext implements Serializable {

  private static final long serialVersionUID = 1L;

  private final WahlParameterWerte importVerzeichnis;

  private final WahlParameterWerte successVerzeichnis;

  private final WahlParameterWerte errorVerzeichnis;

  private final SystemLogQuelle systemLogQuelle;

  private final List<DateienImportierenBackgroundServiceImportContext> importContexts;

  private final Function<File, File> bestimmeNaechsteDateiInVerzeichnis;

  public DateienImportierenBackgroundServiceContext(WahlParameterWerte importVerzeichnis, WahlParameterWerte successVerzeichnis,
      WahlParameterWerte errorVerzeichnis, SystemLogQuelle systemLogQuelle,
      DateienImportierenBackgroundServiceImportContext importContext) {
    this(importVerzeichnis, successVerzeichnis, errorVerzeichnis, systemLogQuelle, Collections.singletonList(importContext));
  }

  public DateienImportierenBackgroundServiceContext(WahlParameterWerte importVerzeichnis, WahlParameterWerte successVerzeichnis,
      WahlParameterWerte errorVerzeichnis, SystemLogQuelle systemLogQuelle, DateienImportierenBackgroundServiceImportContext importContext,
      Function<File, File> bestimmeNaechsteDateiInVerzeichnis) {
    this(importVerzeichnis, successVerzeichnis, errorVerzeichnis, systemLogQuelle, Collections.singletonList(importContext),
        bestimmeNaechsteDateiInVerzeichnis);
  }

  public DateienImportierenBackgroundServiceContext(WahlParameterWerte importVerzeichnis, WahlParameterWerte successVerzeichnis,
      WahlParameterWerte errorVerzeichnis, SystemLogQuelle systemLogQuelle,
      List<DateienImportierenBackgroundServiceImportContext> importContexts) {
    this(importVerzeichnis, successVerzeichnis, errorVerzeichnis, systemLogQuelle, importContexts,
        DateienImportierenBackgroundServiceContext::bestimmeNaechsteDateiAlphabetischSortiert);
  }

  public DateienImportierenBackgroundServiceContext(WahlParameterWerte importVerzeichnis, WahlParameterWerte successVerzeichnis,
      WahlParameterWerte errorVerzeichnis, SystemLogQuelle systemLogQuelle,
      List<DateienImportierenBackgroundServiceImportContext> importContexts, Function<File, File> bestimmeNaechsteDateiInVerzeichnis) {
    super();

    this.importVerzeichnis = importVerzeichnis;
    this.successVerzeichnis = successVerzeichnis;
    this.errorVerzeichnis = errorVerzeichnis;
    this.systemLogQuelle = systemLogQuelle;
    this.importContexts = importContexts;
    this.bestimmeNaechsteDateiInVerzeichnis = bestimmeNaechsteDateiInVerzeichnis;
  }

  public WahlParameterWerte getImportVerzeichnis() {
    return importVerzeichnis;
  }

  public WahlParameterWerte getSuccessVerzeichnis() {
    return successVerzeichnis;
  }

  public WahlParameterWerte getErrorVerzeichnis() {
    return errorVerzeichnis;
  }

  public SystemLogQuelle getQuelle() {
    return systemLogQuelle;
  }

  public List<DateienImportierenBackgroundServiceImportContext> getImportContexts() {
    return importContexts;
  }

  public Function<File, File> getBestimmeNaechsteDateiInVerzeichnis() {
    return bestimmeNaechsteDateiInVerzeichnis;
  }

  @Nullable
  public static File bestimmeNaechsteDateiAlphabetischSortiert(File importVerzeichnis) {
    if (importVerzeichnis == null) {
      return null;
    }

    try {
      return FileUtil.listFilesInDirectoryFast(importVerzeichnis, false).stream()
          // nicht notwendig .filter(File::isFile)
          .filter(s -> StringUtils.isNotBlank(s.getName()))
          .min(Comparator.comparing(File::getName))
          .orElse(null);
    } catch (IOException e) {
      throw new RuntimeException(e.getMessage(), e);
    }
  }

}
