
package de.ivu.elect.was.exchange.ergebnis.csv;

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

import java.io.OutputStream;

import javax.inject.Inject;

import de.ivu.elect.business.datei.entity.DateiFileNames;
import de.ivu.elect.business.datei.entity.FileType;
import de.ivu.elect.business.ergebnis.boundary.ErgebnisExporter;
import de.ivu.elect.business.ergebnis.control.ErgebnisExportContext;
import de.ivu.elect.business.ergebnis.control.ErgebnisExportObject;
import de.ivu.elect.business.ergebnis.control.NlWasErgebnisArtefaktNachGebietErgebniseingabestatusExportContext;
import de.ivu.elect.business.exchange.control.FileFormat;
import de.ivu.elect.business.exchange.control.FileKonfiguration;
import de.ivu.elect.business.wahl.control.AbstractNlExportArtefaktNachSystemExportstatusExportContext;
import de.ivu.elect.business.wahl.control.NlExportArtefaktNachSystemExportstatusExportObject;
import de.ivu.elect.core.exchange.wahl.NlExportArtefaktNachSystemExportstatusRawExportMapper;
import de.ivu.elect.exchange.ExportMapperProvidingDateiFileNames;
import de.ivu.elect.was.exchange.ergebnis.ErgebnisExportMapper;
import de.ivu.elect.was.exchange.wahl.AbstractNlWasCsvNachGebietErgebniseingabestatusExportMapper;

public abstract class AbstractNlWasOsvXxCsvNachGebietErgebniseingabestatusExportMapper extends AbstractNlWasCsvNachGebietErgebniseingabestatusExportMapper {

  @Inject
  private transient ErgebnisExporter ergebnisExporter;

  protected AbstractNlWasOsvXxCsvNachGebietErgebniseingabestatusExportMapper() {
    super();
  }

  @Override
  protected boolean isAcceptContextIgnoringSystemExportstatus(NlWasErgebnisArtefaktNachGebietErgebniseingabestatusExportContext context) {
    return super.isAcceptContextIgnoringSystemExportstatus(context) && isCsvExportMapperAcceptContext(context);
  }

  public boolean isCsvExportMapperAcceptContext(NlWasErgebnisArtefaktNachGebietErgebniseingabestatusExportContext context) {
    return getCsvExportMapper().isAcceptContext(createCsvExportContext(context));
  }

  @Override
  public FileFormat getFileFormat() {
    return getCsvExportMapper().getFileFormat();
  }

  @Override // ELECTVAPP-1584
  protected String createTargetFileName(AbstractNlExportArtefaktNachSystemExportstatusExportContext context, FileFormat fileFormat, FileType fileType) {
    ErgebnisExportMapper csvExportMapper = getCsvExportMapper();

    if (csvExportMapper instanceof ExportMapperProvidingDateiFileNames) {
      ErgebnisExportContext csvExportContext = createCsvExportContext((NlWasErgebnisArtefaktNachGebietErgebniseingabestatusExportContext) context);

      DateiFileNames dateiFileNames = ((ExportMapperProvidingDateiFileNames) csvExportMapper).getDateiExportFileNames(ErgebnisExporter.DATEI_EXPORT_ART, csvExportContext);
      String originalDateiname = dateiFileNames.getOriginalDateiname(fileFormat, context.getWahl(), context.getWahltermin());

      return lowerCase(originalDateiname); // ELECTVAPP-1598
    }

    return super.createTargetFileName(context, fileFormat, fileType);
  }

  @Override
  protected void serialize(NlExportArtefaktNachSystemExportstatusExportObject exportObject, OutputStream os, NlWasErgebnisArtefaktNachGebietErgebniseingabestatusExportContext context,
      FileKonfiguration fileKonfiguration, boolean closeOutputStream) throws Exception {
    ErgebnisExportContext csvExportContext = createCsvExportContext(context);
    ErgebnisExportMapper csvExportMapper = getCsvExportMapper();
    ErgebnisExportObject csvExportObject = createCsvExportObject(csvExportContext);

    new NlExportArtefaktNachSystemExportstatusRawExportMapper<>(context.getWahl(), csvExportMapper).serialize(os, context, csvExportObject, csvExportContext, fileKonfiguration, closeOutputStream);
  }

  protected ErgebnisExportContext createCsvExportContext(NlWasErgebnisArtefaktNachGebietErgebniseingabestatusExportContext context) {
    return new ErgebnisExportContext(getErgebnisDAO().attach(context.getErgebnis()));
  }

  protected ErgebnisExportObject createCsvExportObject(ErgebnisExportContext context) {
    return ergebnisExporter.getExportObject(context);
  }

  protected abstract ErgebnisExportMapper getCsvExportMapper();
}
