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

import java.io.OutputStream;

import javax.inject.Inject;

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.was.exchange.wahl.AbstractNlWasEmlNachGebietErgebniseingabestatusExportMapper;

public abstract class AbstractNlWasEml5xxNachGebietErgebniseingabestatusExportMapper extends AbstractNlWasEmlNachGebietErgebniseingabestatusExportMapper {

  @Inject
  private transient ErgebnisExporter ergebnisExporter;

  protected AbstractNlWasEml5xxNachGebietErgebniseingabestatusExportMapper() {
    super();
  }

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

  public boolean isEmlExportMapperAcceptContext(NlWasErgebnisArtefaktNachGebietErgebniseingabestatusExportContext context) {
    return getEmlExportMapper().isAcceptContext(createEmlExportContext(context)) || isEmlExportMapperAcceptContextOverridden(context);
  }

  protected boolean isEmlExportMapperAcceptContextOverridden(NlWasErgebnisArtefaktNachGebietErgebniseingabestatusExportContext context) {
    return false;
  }

  public boolean isCsbNotwendig() {
    return getEmlExportMapper().isCsbNotwendig();
  }

  public boolean isHsbNotwendig() {
    return getEmlExportMapper().isHsbNotwendig();
  }

  public boolean isPsbNotwendig() {
    return getEmlExportMapper().isPsbNotwendig();
  }

  public boolean isGebietAuswahlNotwendig() {
    return getEmlExportMapper().isGebietAuswahlNotwendig();
  }

  public boolean isErfassungsgebietAuswahlNotwendig() {
    return getEmlExportMapper().isErfassungsgebietAuswahlNotwendig();
  }

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

  @Override // ELECTVAPP-992, ELECTVAPP-1534
  protected String createTargetFileName(AbstractNlExportArtefaktNachSystemExportstatusExportContext context, FileFormat fileFormat, FileType fileType) {
    if (FileType.ZIP.equals(fileType)) {
      try {
        ErgebnisExportContext emlExportContext = createEmlExportContext((NlWasErgebnisArtefaktNachGebietErgebniseingabestatusExportContext) context);

        return getEmlExportMapper().createEmlZipFileName(createEmlExportObject(emlExportContext), emlExportContext);
      } catch (Exception ex) {
        warn("Fehler beim Erzeugen des EML-5xx-ZIP-Dateinamens [fileFormat = " + fileFormat + ", fileType = " + fileType + "]", ex);
      }
    }

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

  @Override
  public boolean supportsTargetFilesSigning(AbstractNlExportArtefaktNachSystemExportstatusExportContext context) {
    return getEmlExportMapper().isSignEml(context.getWahl());
  }

  @Override
  protected void serialize(NlExportArtefaktNachSystemExportstatusExportObject exportObject, OutputStream os, NlWasErgebnisArtefaktNachGebietErgebniseingabestatusExportContext context,
      FileKonfiguration fileKonfiguration, boolean closeOutputStream) throws Exception {
    ErgebnisExportContext emlExportContext = createEmlExportContext(context);

    new NlExportArtefaktNachSystemExportstatusRawExportMapper<>(context.getWahl(), getEmlExportMapper()).serialize(os, context, createEmlExportObject(emlExportContext), emlExportContext,
        fileKonfiguration, closeOutputStream);
  }

  protected ErgebnisExportContext createEmlExportContext(NlWasErgebnisArtefaktNachGebietErgebniseingabestatusExportContext context) {
    return new ErgebnisExportContext(getErgebnisDAO().attach(context.getErgebnis())) {

      private static final long serialVersionUID = 1L;

      @Override
      public void put(String key, Object value) {
        context.addHashCodesPerFileFormat(getFileFormat(), key, value); // ELECT-10233, Parameter mit Hash-Codes übernehmen!

        super.put(key, value);
      }
    };
  }

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

  protected abstract AbstractEml5xxErgebnisExportMapper getEmlExportMapper();
}
