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

import de.ivu.elect.business.ergebnis.entity.Ergebnisart;
import de.ivu.elect.business.gebietsbaum.entity.Wahldurchfuehrungsgebiet;
import de.ivu.elect.business.security.UseCasePermission;
import de.ivu.elect.business.security.control.ElectCommonPrincipalNoScope;
import de.ivu.elect.business.stimmeingabe.entity.Ergebniseingabestatus;
import de.ivu.elect.business.stimmeingabe.entity.Ergebniseingang;
import de.ivu.elect.business.stimmeingabe.entity.ErgebniseingangExceptionContext;
import de.ivu.elect.jee.faces.Messages;
import de.ivu.elect.presentation.gebietsbaum.GebietNummerFormatter;

import javax.enterprise.context.RequestScoped;
import javax.inject.Inject;
import java.util.function.BooleanSupplier;

@RequestScoped // ELECTBB-19
public class ErgebniseingangEingabeInGebietNichtMoeglichValidator implements ErgebniseingangValidator {

  public ErgebniseingangEingabeInGebietNichtMoeglichValidator() {
    super();
  }

  @Override
  public boolean isSpecificPerWahldurchfuehrungErgebniseingangsart() {
    return false;
  }

  @Inject
  private transient Messages messages;

  @Inject
  private transient GebietNummerFormatter gebietNummerFormatter;

  @Override
  public void validate(Ergebniseingang ergebniseingang) {
    Ergebnisart ergebnisart = ergebniseingang.getErgebniseingangsart().korrespondierendeErgebnisart();

    Wahldurchfuehrungsgebiet gebietDasEingabeNichtZulaesst = ergebniseingang.getWahldurchfuehrungsgebiet()
            .getErstesGebietInHierarchieDasEingabeNichtZulaesst(ergebnisart, ergebniseingang.getErgebniseingangsherkunft(), getEingangsherkunftIgnorieren());

    if (gebietDasEingabeNichtZulaesst == null) {
      return; // ALLES GUT
    }

    Ergebniseingabestatus ergebniseingabestatus = gebietDasEingabeNichtZulaesst.getErgebniseingabestatus(ergebnisart);

    throw ergebniseingabestatus.getEingabeNichtMoeglichException(new ErgebniseingangExceptionContext(gebietDasEingabeNichtZulaesst, ergebniseingang.getErgebniseingangsherkunft(), gebietNummerFormatter, messages));
  }

  protected BooleanSupplier getEingangsherkunftIgnorieren() {
    return () -> ElectCommonPrincipalNoScope.getPricipal().hasUseCasePermission(UseCasePermission.STIMMEINGABE_CREATE_EINGANGSHERKUNFT_IGNORIEREN);
  }
}
