
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.ergebnis.entity.Ergebnis;
import de.ivu.elect.business.ergebnis.entity.Ergebnisart;
import de.ivu.elect.business.gebietsbaum.boundary.WahldurchfuehrungsgebietExtendedDAO;
import de.ivu.elect.business.gebietsbaum.entity.Gebiet;
import de.ivu.elect.business.gebietsbaum.entity.Wahldurchfuehrungsgebiet;
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.business.stimmeingabe.entity.Ergebniseingangsherkunft;
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;
    }

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

    Ergebnis ergebnis = ergebnisSessionSelect.getEntity();

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

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

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

        if (wahldurchfuehrungsgebietInHierarchieDasEingabeNichtZulaesst != null) {
          ErgebniseingangExceptionContext 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
  }
}
