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

import java.io.File;
import java.io.Serializable;
import java.util.function.BiFunction;
import java.util.function.Function;

import de.ivu.elect.business.datei.entity.DateiImportBerichtCustomData;
import de.ivu.elect.business.exchange.control.AbstractImporter;
import de.ivu.elect.business.exchange.control.DateienImportFormatResolver;
import de.ivu.elect.business.mandant.entity.EntityPKMitMandant;
import de.ivu.elect.business.mandant.entity.Mandant;
import de.ivu.elect.business.mandant.entity.MandantPK;
import de.ivu.elect.business.wahl.entity.WahlOderWahltermin;
import de.ivu.elect.jee.exchange.ImportOptions;

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

  private final EntityPKMitMandant mandantPK;

  private final Class<? extends AbstractImporter> importerClass;

  private final Iterable<? extends DateienImportFormatResolver> formatResolvers;

  private final DateiImportArt dateiImportArt;

  private final BiFunction<WahlOderWahltermin, File, Object> contextFct;

  private final ImportOptions importOptions;

  private DateiImportBerichtCustomData dateiImportBerichtCustomData;

  private final Function<WahlOderWahltermin, WahlOderWahltermin> wahlOderWahlterminFuerDateiFct;

  public DateienImportierenBackgroundServiceImportContext(EntityPKMitMandant mandantPK, Class<? extends AbstractImporter> importerClass, Iterable<? extends DateienImportFormatResolver> formatResolvers, DateiImportArt dateiImportArt, Function<WahlOderWahltermin, Object> contextFct, ImportOptions importOptions, DateiImportBerichtCustomData dateiImportBerichtCustomData) {
    this(mandantPK, importerClass, formatResolvers, dateiImportArt, (wahlOderWahltermin, ignore) -> contextFct.apply(wahlOderWahltermin), importOptions, dateiImportBerichtCustomData);
  }

  public DateienImportierenBackgroundServiceImportContext(EntityPKMitMandant mandantPK, Class<? extends AbstractImporter> importerClass, Iterable<? extends DateienImportFormatResolver> formatResolvers, DateiImportArt dateiImportArt, BiFunction<WahlOderWahltermin, File, Object> contextFct, ImportOptions importOptions, DateiImportBerichtCustomData dateiImportBerichtCustomData) {
    this(mandantPK, importerClass, formatResolvers, dateiImportArt, contextFct, importOptions, dateiImportBerichtCustomData, Function.identity());
  }

  public DateienImportierenBackgroundServiceImportContext(EntityPKMitMandant mandantPK, Class<? extends AbstractImporter> importerClass, Iterable<? extends DateienImportFormatResolver> formatResolvers, DateiImportArt dateiImportArt, BiFunction<WahlOderWahltermin, File, Object> contextFct, ImportOptions importOptions, DateiImportBerichtCustomData dateiImportBerichtCustomData, Function<WahlOderWahltermin, WahlOderWahltermin> wahlOderWahlterminFuerDateiFct) {
    this.mandantPK = mandantPK;
    this.importerClass = importerClass;
    this.formatResolvers = formatResolvers;
    this.dateiImportArt = dateiImportArt;
    this.contextFct = contextFct;
    this.importOptions = importOptions;
    this.dateiImportBerichtCustomData = dateiImportBerichtCustomData;
    this.wahlOderWahlterminFuerDateiFct = wahlOderWahlterminFuerDateiFct;
  }

  public DateiImportArt getDateiImportArt() {
    return dateiImportArt;
  }

  public BiFunction<WahlOderWahltermin, File, Object> getContextFct() {
    return contextFct;
  }

  public ImportOptions getImportOptions() {
    return importOptions;
  }

  public Function<WahlOderWahltermin, WahlOderWahltermin> getWahlOderWahlterminFuerDateiFct() {
    return wahlOderWahlterminFuerDateiFct;
  }

  public DateiImportBerichtCustomData getDateiImportBerichtCustomData() {
    return dateiImportBerichtCustomData;
  }

  public Class<? extends AbstractImporter> getImporterClass() {
    return importerClass;
  }

  public Iterable<? extends DateienImportFormatResolver> getFormatResolvers() {
    return formatResolvers;
  }

  public EntityPKMitMandant getMandantPK() {
    return mandantPK;
  }

  @Override
  public String toString() {
    return "DateienImportierenBackgroundServiceImportContext{" +
            "mandantPK=" + mandantPK +
            "dateiImportArt=" + dateiImportArt +
            ", importOptions=" + importOptions +
            '}';
  }
}
