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

import javax.enterprise.inject.Specializes;
import javax.inject.Inject;

import de.ivu.elect.business.stimmeingabe.entity.Ergebniseingang;
import de.ivu.elect.business.stimmeingabe.entity.ErgebniseingangErfasser;
import de.ivu.elect.jee.faces.Messages;

@Specializes
public class NlStimmeingabeCreate extends StimmeingabeCreate {

  @Inject
  protected transient Messages messages;

  @Inject
  protected transient ErgebniseingangEndstufeAusVorstufeCreate ergebniseingangEndstufeAusVorstufeCreate;

  public NlStimmeingabeCreate() {
    super();
  }

  @Override
  protected void postSaveInternal(Ergebniseingang ergebniseingang, StimmeingabePlausiBuilder stimmeingabePlausiBuilder) {
    super.postSaveInternal(ergebniseingang, stimmeingabePlausiBuilder);

    createAndSaveErgebniseingangEndstufeAutomatisch(ErgebniseingangErfasser.system(), ergebniseingang, stimmeingabePlausiBuilder);
  }

  public void createAndSaveErgebniseingangEndstufeAutomatisch(ErgebniseingangErfasser erfasser, Ergebniseingang ergebniseingang, StimmeingabePlausiBuilder stimmeingabePlausiBuilder) {
    ergebniseingangEndstufeAusVorstufeCreate.createErgebnisErgebniseingangEndstufeFallsZulaessig(erfasser, ergebniseingang)
        .ifPresent(ergebniseingangEndstufe -> saveErgebniseingangEndstufe(ergebniseingangEndstufe, stimmeingabePlausiBuilder));
  }

  public void createAndSaveErgebniseingangEndstufeManuell(ErgebniseingangErfasser erfasser, Ergebniseingang ergebniseingang, StimmeingabePlausiBuilder stimmeingabePlausiBuilder) {
    Ergebniseingang ergebniseingangEndstufe = ergebniseingangEndstufeAusVorstufeCreate.createErgebniseingangEndstufe(erfasser, ergebniseingang);
    ergebniseingangEndstufe
        .setErfasser(getMessage("stimmeingabe.erfassen.action.in.erebnis.uebernehmen.erfasser.format", erfasser.getKennung(), ErgebniseingangErfasser.benutzer(ergebniseingang).getKennung())); // ELECTVAPP-602

    saveErgebniseingangEndstufe(ergebniseingangEndstufe, stimmeingabePlausiBuilder);
  }

  private void saveErgebniseingangEndstufe(Ergebniseingang ergebniseingangEndstufe, StimmeingabePlausiBuilder stimmeingabePlausiBuilder) {
    StimmeingabePlausiBuilder stimmeingabePlausiBuilderAngewandt = StimmeingabePlausiBuilder.NO_OP_BUILDER;

    if (ergebniseingangEndstufe.getErgebniseingangsfehlerstatus() == null) {
      stimmeingabePlausiBuilderAngewandt = stimmeingabePlausiBuilder;
    }

    saveOhneLetzterErgebniseingangInGebietPruefungMitStimmeingabePlausibilisierung(ergebniseingangEndstufe, null, stimmeingabePlausiBuilderAngewandt);

    // Programmatisch angelegte Stimmeingabefehler persistieren, cf. ErgebniseingangEndstufeAusVorstufeCreate#createErgebnisErgebniseingangEndstufeFallsZulaessig!!!
    if (stimmeingabePlausiBuilderAngewandt == null || StimmeingabePlausiBuilder.NO_OP_BUILDER.equals(stimmeingabePlausiBuilderAngewandt)) {
      ergebniseingangEndstufe.getStimmeingabefehler().forEach(this::persistiere);
    }

    if (ergebniseingangEndstufe.isUngueltigKannFehler() && ergebniseingangEndstufe.hasErfasserSystem()
        && !ergebniseingangEndstufeAusVorstufeCreate.containsAnyStimmeingabefehlerEndstufeSpezifisch(ergebniseingangEndstufe)) {
      ergebniseingangEndstufe.setGueltigKannFehler(); // ELECTVAPP-209
    }
  }

  private String getMessage(String msgKey, Object... params) {
    return messages.getMessageForMessageKey(msgKey, params);
  }
}
