
package de.ivu.elect.core.exchange.wahl;

import java.io.OutputStream;
import java.util.List;

import de.ivu.elect.business.datei.entity.FileType;
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.exchange.ExportMapper;

public interface NlExportArtefaktNachSystemExportstatusExportMapper
    extends
      ExportMapper<NlExportArtefaktNachSystemExportstatusExportObject, AbstractNlExportArtefaktNachSystemExportstatusExportContext> {

  /**
   * @return Gibt true zurück, falls der Export UNABHÄNGIG VOM STATUS DES SYSTEMS (GEBIETSTATUS, WAHLPHASE) überhaupt möglich ist!
   *
   * @see NlExportArtefaktNachSystemExportstatusExportMapper#isAcceptSystemExportstatus
   */
  boolean isAcceptContextIgnoringSystemExportstatus(AbstractNlExportArtefaktNachSystemExportstatusExportContext context);

  /**
   * @return Gibt true zurück, falls der Export ABHÄNGIG VOM STATUS DES SYSTEMS (GEBIETSTATUS, WAHLPHASE) aktuell möglich ist!
   *
   * @see NlExportArtefaktNachSystemExportstatusExportMapper#isAcceptContextIgnoringSystemExportstatus
   */
  boolean isAcceptSystemExportstatus(AbstractNlExportArtefaktNachSystemExportstatusExportContext context);

  default String getFileFormatName() {
    return getFileFormat().getName();
  }

  boolean supportsBulkExportNachSystemExportstatus();

  default boolean requiresTargetFileInSeparateDateiExport(AbstractNlExportArtefaktNachSystemExportstatusExportContext context) {
    return supportsTargetFileSigning(context); // ELECTVAPP-794, ELECTVAPP-795
  }

  boolean supportsTargetFileSigning(AbstractNlExportArtefaktNachSystemExportstatusExportContext context);

  boolean supportsTargetFileHashCode(AbstractNlExportArtefaktNachSystemExportstatusExportContext context);

  List<FileType> getTargetFileTypes(AbstractNlExportArtefaktNachSystemExportstatusExportContext context);

  String createTargetFileName(AbstractNlExportArtefaktNachSystemExportstatusExportContext context, FileType fileType);

  void serialize(NlExportArtefaktNachSystemExportstatusExportObject exportObject, OutputStream os, AbstractNlExportArtefaktNachSystemExportstatusExportContext context,
      FileKonfiguration fileKonfiguration, boolean closeOutputStream) throws Exception;

  boolean requiresWahlbehoerdeWahlleiterName(AbstractNlExportArtefaktNachSystemExportstatusExportContext context);

  boolean requiresWahlbehoerdeAnschriftStrasseHausnummer(AbstractNlExportArtefaktNachSystemExportstatusExportContext context);

  boolean requiresWahlbehoerdeAnschriftOrt(AbstractNlExportArtefaktNachSystemExportstatusExportContext context);

  boolean requiresWahlbehoerdeAnschriftPlz(AbstractNlExportArtefaktNachSystemExportstatusExportContext context);

  boolean requiresWahlbehoerdeDokumentErstelltAnschriftStrasseHausnummer(AbstractNlExportArtefaktNachSystemExportstatusExportContext context);

  boolean requiresWahlbehoerdeDokumentErstelltAnschriftOrt(AbstractNlExportArtefaktNachSystemExportstatusExportContext context);

  boolean requiresWahlbehoerdeDokumentErstelltAnschriftPlz(AbstractNlExportArtefaktNachSystemExportstatusExportContext context);

  boolean requiresWahlbehoerdeDokumentErstelltAm(AbstractNlExportArtefaktNachSystemExportstatusExportContext context);

  boolean requiresGewaehltesGremiumDurchfuehrendesOrgan(AbstractNlExportArtefaktNachSystemExportstatusExportContext context);

  boolean requiresGewaehltesGremiumAnschriftStrasseHausnummer(AbstractNlExportArtefaktNachSystemExportstatusExportContext context);

  boolean requiresGewaehltesGremiumAnschriftOrt(AbstractNlExportArtefaktNachSystemExportstatusExportContext context);

  boolean requiresGewaehltesGremiumAnschriftPlz(AbstractNlExportArtefaktNachSystemExportstatusExportContext context);

  boolean requiresWahlausschusssitzungAnschriftStrasseHausnummer(AbstractNlExportArtefaktNachSystemExportstatusExportContext context);

  boolean requiresWahlausschusssitzungAnschriftOrt(AbstractNlExportArtefaktNachSystemExportstatusExportContext context);

  boolean requiresWahlausschusssitzungAnschriftPlz(AbstractNlExportArtefaktNachSystemExportstatusExportContext context);

  boolean requiresWahlausschusssitzungBeginn(AbstractNlExportArtefaktNachSystemExportstatusExportContext context);

  boolean requiresWahlausschusssitzungEnde(AbstractNlExportArtefaktNachSystemExportstatusExportContext context);

  boolean requiresWahlausschusssitzungEinwaende(AbstractNlExportArtefaktNachSystemExportstatusExportContext context);

  boolean requiresWahlausschusssitzungEinwaendeBemerkungen(AbstractNlExportArtefaktNachSystemExportstatusExportContext context);

  boolean requiresWahlausschusssitzungUnterzeichner1Name(AbstractNlExportArtefaktNachSystemExportstatusExportContext context);

  boolean requiresWahlausschusssitzungUnterzeichner1Rolle(AbstractNlExportArtefaktNachSystemExportstatusExportContext context);

  boolean requiresWahlausschusssitzungUnterzeichner2Name(AbstractNlExportArtefaktNachSystemExportstatusExportContext context);

  boolean requiresWahlausschusssitzungUnterzeichner2Rolle(AbstractNlExportArtefaktNachSystemExportstatusExportContext context);

  boolean requiresFristZuletztGesetztBeginn(AbstractNlExportArtefaktNachSystemExportstatusExportContext context);

  boolean requiresFristZuletztGesetztEnde(AbstractNlExportArtefaktNachSystemExportstatusExportContext context);

  boolean requiresWahlvorschlagEinreichungAbgabefrist(AbstractNlExportArtefaktNachSystemExportstatusExportContext context);

  boolean requiresWahlvorschlagEinreichungAnschriftOrt(AbstractNlExportArtefaktNachSystemExportstatusExportContext context);

  boolean requiresWahlvorschlagEinreichungUnterzeichner1Name(AbstractNlExportArtefaktNachSystemExportstatusExportContext context);

  boolean requiresWahlvorschlagVeroeffentlichungBeginn(AbstractNlExportArtefaktNachSystemExportstatusExportContext context);

  boolean requiresWahlvorschlagVeroeffentlichungAnschriftOrt(AbstractNlExportArtefaktNachSystemExportstatusExportContext context);

  boolean requiresWahlvorschlagVeroeffentlichungUnterzeichner1Name(AbstractNlExportArtefaktNachSystemExportstatusExportContext context);
}
