
package de.ivu.elect.presentation.gebietsbaum;

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

import de.ivu.elect.business.ergebnis.boundary.ErgebnisSessionSelect;
import de.ivu.elect.business.gebietsbaum.boundary.WahldurchfuehrungsgebietExtendedDAO;
import de.ivu.elect.business.gebietsbaum.entity.Gebiet;
import de.ivu.elect.business.internet.entity.PraesentationGenerierenEvent;
import de.ivu.elect.business.security.UseCasePermission;
import de.ivu.elect.business.security.control.ElectCommonPrincipal;
import de.ivu.elect.business.stimmeingabe.entity.ErgebniseingangExceptionContext;
import de.ivu.elect.presentation.gebietsbaum.form.CoreGebietEditBuilder;
import de.ivu.elect.presentation.stimmeingabe.AbstractStimmeingabeErfassenView;

@Specializes
public class WasGebietEditBuilder extends CoreGebietEditBuilder {

  private static final long serialVersionUID = 1L;

  @Inject
  private transient WahldurchfuehrungsgebietExtendedDAO wahldurchfuehrungsgebietExtendedDAO;

  @Inject
  private transient ErgebnisSessionSelect ergebnisSessionSelect;

  @Inject
  private transient PraesentationGenerierenEvent praesentationGenerierenEvent;

  @Inject
  private transient ElectCommonPrincipal electCommonPrincipal;

  @Inject
  private transient GebietNummerFormatter gebietNummerFormatter;

  public WasGebietEditBuilder() {
    super();
  }

  @Override
  public void preRenderView(Gebiet gebiet) {
    super.preRenderView(gebiet);

    if (gebiet == null) {
      return;
    }

    var wahldurchfuehrungsgebiet = wahldurchfuehrungsgebietExtendedDAO.findByPrimaryKey(gebiet.getPk());

    var ergebnis = ergebnisSessionSelect.getEntity();

    if (ergebnis != null) {
      var ergebnisart = ergebnis.getErgebnisart();

      if (ergebnisart.isVorlaeufig() || ergebnisart.isEndgueltig()) {
        var ergebniseingangsherkunftManuelleErfassung = AbstractStimmeingabeErfassenView.ERGEBNISEINGANGSHERKUNFT_MANUELLE_ERFASSUNG;

        var wahldurchfuehrungsgebietInHierarchieDasEingabeNichtZulaesst = wahldurchfuehrungsgebiet.getErstesGebietInHierarchieDasEingabeNichtZulaesst(
            ergebnisart,
            ergebniseingangsherkunftManuelleErfassung,
            () -> electCommonPrincipal.hasUseCasePermission(UseCasePermission.STIMMEINGABE_CREATE_EINGANGSHERKUNFT_IGNORIEREN));

        if (wahldurchfuehrungsgebietInHierarchieDasEingabeNichtZulaesst != null) {
          var ergebniseingangExceptionContext = new ErgebniseingangExceptionContext(wahldurchfuehrungsgebietInHierarchieDasEingabeNichtZulaesst,
              ergebniseingangsherkunftManuelleErfassung, gebietNummerFormatter, getMessages());

          wahldurchfuehrungsgebietInHierarchieDasEingabeNichtZulaesst.getErgebniseingabestatus(ergebnisart)
              .addInfoMessageEingabeUntergeordnetNichtMoeglich(ergebniseingangExceptionContext);
        }
      }
    }
  }

  @Override
  public void onGebietChanged() {
    super.onGebietChanged();

    praesentationGenerierenEvent.sendChangeEvent(); // Bei Änderungen kann die Präsentation beeinflusst werden => anstoßen
  }
}
