
package de.ivu.elect.dokumente.ergebnis;

import static java.util.Arrays.asList;

import java.io.OutputStream;
import java.util.Collection;

import javax.inject.Inject;

import de.ivu.elect.business.ergebnis.boundary.NlWasModelNa141BulkExporter;
import de.ivu.elect.business.ergebnis.control.NlWasErgebnisArtefaktNachGebietErgebniseingabestatusExportContext;
import de.ivu.elect.business.exchange.control.FileKonfiguration;
import de.ivu.elect.business.security.Customer;
import de.ivu.elect.business.stimmeingabe.entity.Ergebniseingabestatus;
import de.ivu.elect.business.stimmzettel.boundary.EntityAufStimmzettelDatenDAOFactory;
import de.ivu.elect.business.wahl.control.AbstractNlExportArtefaktNachSystemExportstatusExportContext;
import de.ivu.elect.business.wahl.control.NlExportArtefaktNachSystemExportstatusExportObject;
import de.ivu.elect.business.wahl.entity.NlWahlCustomData;
import de.ivu.elect.business.wahl.entity.NlWahlPhase;
import de.ivu.elect.business.wahl.entity.NlWahlart;
import de.ivu.elect.business.wahl.entity.Wahl;
import de.ivu.elect.business.wahlvorschlag.boundary.ListeDAO;
import de.ivu.elect.was.exchange.ergebnis.NlWasModelNa141ExportMapper;

/**
 * ELECT-15235
 *
 * Ist das Gegenstück zu Model Na 14-2 Bijlage 2 bei ZENTRALER Erfassung.
 */
public class NlWasModelNa141MainDocumentExportMapper extends AbstractNlWasGesamtErgebnisDokumentNachGebietErgebniseingabestatusDocumentExportMapper
    implements
      NlWasModelNa141ExportMapper,
      NlWasErgebnisdokumentMitEmlErgebnisDifferenzLeerDocumentExportMapper {

  public static final String FILE_FORMAT_NAME = "file.format.ergebnisdokument.export.modelna141.main";

  @Inject
  private transient EntityAufStimmzettelDatenDAOFactory entityAufStimmzettelDatenDAOFactory;

  @Inject
  private transient ListeDAO listeDAO;

  public NlWasModelNa141MainDocumentExportMapper() {
    super();
  }

  @Override
  public boolean supportsBulkExportNachSystemExportstatus(AbstractNlExportArtefaktNachSystemExportstatusExportContext context) {
    return false; // Export über eigenen Menüpunkt (und nicht als Teil eines Exportes nach Wahlphase), cf. NlWasExportArtefaktNachSystemExportstatusMainMenuEntry...
  }

  @Override
  protected boolean isAcceptWahlart(Wahl wahl, Customer customer) {
    return super.isAcceptWahlart(wahl, customer) && NlWahlPhase.ERFASSUNG.equals(wahl.getCustomData(NlWahlCustomData.class).getNlWahlPhase()); // ELECT-15277
  }

  @Override // https://support.elect-it.com/wiki/x/48g8
  protected boolean isAcceptWahlebene(Wahl wahl, Customer customer) {
    return NlWahlart.isWasPSB(wahl, customer);
  }

  @Override // https://support.elect-it.com/wiki/x/48g8
  protected Collection<NlWahlart> collectWahlartenAccepted() {
    return asList( //
        NlWahlart.TWEEDE_KAMER, //
        NlWahlart.EUROPEES_PARLEMENT, //
        NlWahlart.PROVINCIALE_STATEN1, //
        NlWahlart.PROVINCIALE_STATEN2, //
        NlWahlart.GEMEENTERAAD, //
        NlWahlart.BESTUURSCOMMISSIE, //
        NlWahlart.EILANDSRAAD, //
        NlWahlart.WATERSCHAP //
    );
  }

  @Override
  protected Collection<Ergebniseingabestatus> collectErgebniseingabestatusAccepted() {
    return NlWasModelNa141BulkExporter.EXPORT_ERGEBNISEINGABESTATUS;
  }

  @Override
  protected boolean isAcceptWahlergebniserfassung(Wahl wahl, Customer customer) {
    return !wahl.getCustomData(NlWahlCustomData.class).isZentraleErfassung(); // ELECT-15277
  }

  @Override
  public String getFileFormatName() {
    return FILE_FORMAT_NAME;
  }

  @Override
  protected String getDokumentVorlageNameInfix() {
    return "Model Na 14-1";
  }

  @Override
  protected void serialize(NlExportArtefaktNachSystemExportstatusExportObject exportObject, OutputStream os, NlWasErgebnisArtefaktNachGebietErgebniseingabestatusExportContext context,
      FileKonfiguration fileKonfiguration, boolean closeOutputStream) throws Exception {
    initEmlErgebnisDifferenzLeer(context, entityAufStimmzettelDatenDAOFactory, listeDAO);

    super.serialize(exportObject, os, context, fileKonfiguration, closeOutputStream);
  }

  /*
   * https://support.elect-it.com/wiki/x/XoE8
   */

  @Override
  public boolean requiresWahlbehoerdeWahlleiterName(AbstractNlExportArtefaktNachSystemExportstatusExportContext context) {
    return false;
  }

  @Override
  public boolean requiresWahlbehoerdeAnschriftStrasseHausnummer(AbstractNlExportArtefaktNachSystemExportstatusExportContext context) {
    return false;
  }

  @Override
  public boolean requiresWahlbehoerdeAnschriftOrt(AbstractNlExportArtefaktNachSystemExportstatusExportContext context) {
    return false;
  }

  @Override
  public boolean requiresWahlbehoerdeAnschriftPlz(AbstractNlExportArtefaktNachSystemExportstatusExportContext context) {
    return false;
  }

  @Override
  public boolean requiresWahlbehoerdeDokumentErstelltAnschriftStrasseHausnummer(AbstractNlExportArtefaktNachSystemExportstatusExportContext context) {
    return false;
  }

  @Override
  public boolean requiresWahlbehoerdeDokumentErstelltAnschriftOrt(AbstractNlExportArtefaktNachSystemExportstatusExportContext context) {
    return false;
  }

  @Override
  public boolean requiresWahlbehoerdeDokumentErstelltAnschriftPlz(AbstractNlExportArtefaktNachSystemExportstatusExportContext context) {
    return false;
  }

  @Override
  public boolean requiresWahlbehoerdeDokumentErstelltAm(AbstractNlExportArtefaktNachSystemExportstatusExportContext context) {
    return false;
  }

  @Override
  public boolean requiresGewaehltesGremiumAnschriftStrasseHausnummer(AbstractNlExportArtefaktNachSystemExportstatusExportContext context) {
    return false;
  }

  @Override
  public boolean requiresGewaehltesGremiumAnschriftOrt(AbstractNlExportArtefaktNachSystemExportstatusExportContext context) {
    return false;
  }

  @Override
  public boolean requiresGewaehltesGremiumAnschriftPlz(AbstractNlExportArtefaktNachSystemExportstatusExportContext context) {
    return false;
  }

  @Override
  public boolean requiresWahlausschusssitzungAnschriftStrasseHausnummer(AbstractNlExportArtefaktNachSystemExportstatusExportContext context) {
    return false;
  }

  @Override
  public boolean requiresWahlausschusssitzungAnschriftOrt(AbstractNlExportArtefaktNachSystemExportstatusExportContext context) {
    return false;
  }

  @Override
  public boolean requiresWahlausschusssitzungAnschriftPlz(AbstractNlExportArtefaktNachSystemExportstatusExportContext context) {
    return false;
  }

  @Override
  public boolean requiresWahlausschusssitzungBeginn(AbstractNlExportArtefaktNachSystemExportstatusExportContext context) {
    return false;
  }

  @Override
  public boolean requiresWahlausschusssitzungEnde(AbstractNlExportArtefaktNachSystemExportstatusExportContext context) {
    return false;
  }

  @Override
  public boolean requiresWahlausschusssitzungEinwaende(AbstractNlExportArtefaktNachSystemExportstatusExportContext context) {
    return false;
  }

  @Override
  public boolean requiresWahlausschusssitzungEinwaendeBemerkungen(AbstractNlExportArtefaktNachSystemExportstatusExportContext context) {
    return false;
  }

  @Override
  public boolean requiresKorrekturenStimmeingabenKopfzahlenWaehlerVorhanden(AbstractNlExportArtefaktNachSystemExportstatusExportContext context) {
    return true;
  }

  @Override
  public boolean requiresKorrekturenStimmeingabenKopfzahlenStimmzettelVorhanden(AbstractNlExportArtefaktNachSystemExportstatusExportContext context) {
    return true;
  }

  @Override
  public boolean requiresKorrekturenStimmeingabenKopfzahlenStimmzettelAbweichendVorhanden(AbstractNlExportArtefaktNachSystemExportstatusExportContext context) {
    return true;
  }

  @Override
  public boolean requiresKorrekturenStimmeingabenStimmenListenIds(AbstractNlExportArtefaktNachSystemExportstatusExportContext context) {
    return true;
  }
}
