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

import de.ivu.elect.business.stimmeingabe.boundary.ErgebniseingangExporter;
import de.ivu.elect.business.stimmeingabe.control.validierung.ErgebniseingangValidator;
import de.ivu.elect.business.stimmeingabe.entity.Ergebniseingang;
import de.ivu.elect.business.stimmeingabe.entity.Stimmeingabefehler;

import javax.annotation.Nullable;
import javax.enterprise.inject.Instance;
import javax.inject.Inject;

public abstract class AbstractElectStimmeingabeCreate extends AbstractStimmeingabeCreate {

  @Inject
  protected transient Instance<ErgebniseingangValidator> ergebniseingangValidatoren;

  @Inject
  protected transient ErgebniseingangCreate ergebniseingangCreate;

  @Inject
  protected transient ErgebniseingangExporter ergebniseingangExporter;

  @Inject
  protected transient StimmeingabefehlerCreate stimmeingabefehlerCreate;

  protected Instance<ErgebniseingangValidator> getDefaultErgebniseingangValidatoren() {
    return ergebniseingangValidatoren;
  }

  protected void saveErgebniseingang(Ergebniseingang ergebniseingang, @Nullable Ergebniseingang letzterErgebniseingangInGebietErwartet, boolean letztenErgebniseingangInGebietPruefen,
                                     Iterable<ErgebniseingangValidator> ergebniseingangValidatoren) {
    ergebniseingangCreate.save(ergebniseingang, letzterErgebniseingangInGebietErwartet, letztenErgebniseingangInGebietPruefen, ergebniseingangValidatoren);
  }


  protected void postSave(Ergebniseingang ergebniseingang) {
    ergebniseingangInDateiSchreiben(ergebniseingang);
  }

  /**
   * Schön ist anders....
   */
  protected void ergebniseingangInDateiSchreiben(Ergebniseingang ergebniseingang) {
    exportiereStimmeingaben(ergebniseingang);
  }

  public void exportiereStimmeingaben(Ergebniseingang ergebniseingang) {
    ergebniseingangExporter.export(ergebniseingang);
  }

  protected void persistiere(Stimmeingabefehler stimmeingabefehler) {
    stimmeingabefehlerCreate.save(stimmeingabefehler);
  }

}
