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

import java.io.File;
import java.util.function.Consumer;

import javax.inject.Inject;

import de.ivu.elect.business.datei.entity.CsvAnfuehrungszeichen;
import de.ivu.elect.business.datei.entity.CsvDatei;
import de.ivu.elect.business.datei.entity.CsvTrennzeichen;
import de.ivu.elect.business.datei.entity.CsvZeichensatz;
import de.ivu.elect.business.datei.entity.DateiImport;
import de.ivu.elect.business.wahl.entity.WahlOderWahltermin;
import de.ivu.elect.business.wahl.entity.WahlParameterLoader;
import de.ivu.elect.business.wahl.entity.WahlParameterWerte;


import static org.apache.commons.lang3.StringUtils.isNotBlank;

// Abgeleitete Klasse mit @Stateless annotieren.
public abstract class AbstractWahlParameterDateienImportierenFormatResolver implements DateienImportFormatResolver {

  @Inject
  private transient WahlParameterLoader wahlParameterLoader;

  public AbstractWahlParameterDateienImportierenFormatResolver() {
    super();
  }

  @Override
  public Consumer<DateiImport> getDateiImportHandler() {
    return dateiImport -> {
      if (dateiImport.getDatei().isInstanceOf(CsvDatei.class)) {
        CsvDatei csvDatei = dateiImport.getDatei().castTo(CsvDatei.class).getEntity();
        WahlOderWahltermin wahlOderWahltermin = bestimmeWahlOderWahltermin(csvDatei);
        setzeZeichensatz(wahlOderWahltermin, csvDatei);
        setzeKopfzeilen(wahlOderWahltermin, csvDatei);
        setzeTrennzeichen(wahlOderWahltermin, csvDatei);
        setzeAnfuehrungszeichen(wahlOderWahltermin, csvDatei);
      }
    };
  }

  private WahlOderWahltermin bestimmeWahlOderWahltermin(CsvDatei csvDatei) {
    if (csvDatei.getWahl() != null) {
      return csvDatei.getWahl();
    }

    return csvDatei.getWahltermin();
  }

  protected void setzeAnfuehrungszeichen(WahlOderWahltermin wahlOderWahltermin, CsvDatei csvDatei) {
    String anfuehrungszeichen = wahlParameterLoader.resolveStringValue(wahlOderWahltermin, getCsvAnfuehrungszeichenKonfig());

    if (isNotBlank(anfuehrungszeichen)) {
      csvDatei.setAnfuehrungszeichen(CsvAnfuehrungszeichen.valueOf(anfuehrungszeichen));
    }
  }

  protected abstract WahlParameterWerte getCsvAnfuehrungszeichenKonfig();

  protected void setzeTrennzeichen(WahlOderWahltermin wahlOderWahltermin, CsvDatei csvDatei) {
    String trennzeichen = wahlParameterLoader.resolveStringValue(wahlOderWahltermin, getCsvTrennzeichenKonfig());

    if (isNotBlank(trennzeichen)) {
      csvDatei.setTrennzeichen(CsvTrennzeichen.valueOf(trennzeichen));
    }
  }

  protected abstract WahlParameterWerte getCsvTrennzeichenKonfig();

  protected void setzeKopfzeilen(WahlOderWahltermin wahlOderWahltermin, CsvDatei csvDatei) {
    String kopfzeilen = wahlParameterLoader.resolveStringValue(wahlOderWahltermin, getCsvAnzahlKopfzeilenKonfig());

    if (isNotBlank(kopfzeilen)) {
      csvDatei.setAnzahlKopfzeilen(Long.parseLong(kopfzeilen));
    }
  }

  protected abstract WahlParameterWerte getCsvAnzahlKopfzeilenKonfig();

  protected void setzeZeichensatz(WahlOderWahltermin wahlOderWahltermin, CsvDatei csvDatei) {
    String zeichensatz = wahlParameterLoader.resolveStringValue(wahlOderWahltermin, getCsvZeichensatzKonfig());

    if (isNotBlank(zeichensatz)) {
      csvDatei.setZeichensatz(CsvZeichensatz.valueOf(zeichensatz));
    }
  }

  protected abstract WahlParameterWerte getCsvZeichensatzKonfig();

  @Override
  public void validierungVorImport(WahlOderWahltermin wahlOderWahltermin, File naechsteDatei) {
    // nichts zu tun
  }

  @Override
  public void postImport(WahlOderWahltermin wahlOderWahltermin, File naechsteDatei) {
    // nichts zu tun
  }
}
