
package de.ivu.elect.business.wahl.boundary;

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

import de.ivu.elect.business.security.control.ElectCommonPrincipal;
import de.ivu.elect.business.wahl.entity.Wahl;
import de.ivu.elect.jee.faces.FacesContextUtil;
import de.ivu.elect.jee.faces.Messages;
import de.ivu.elect.jee.presentation.security.StartViewResolver;


import static java.util.Objects.nonNull;

@Specializes
public class ElectCommonWahlSessionSelect extends WahlSessionSelect {

  private static final long serialVersionUID = 1L;

  @Inject
  protected transient Messages messages;

  @Inject
  protected transient StartViewResolver startViewResolver;

  @Inject
  private transient ElectCommonPrincipal principal;

  public ElectCommonWahlSessionSelect() {
    super();
  }

  @Override
  public Wahl getEntity() {
    Wahl wahl = super.getEntity();

    if (nonNull(wahl) && !wahl.getStatus().isAuswaehlbar()) {
      clearWahlSelectUndRedirectToStartView("wahl.session.select.wahl.gesperrt");

      return null;
    }

    return wahl;
  }

  protected void clearWahlSelectUndRedirectToStartView(String messageKey) {
    sessionStore.setEntityPK(null); // notwendig wegen Endlosschleife

    setEntity((Wahl) null); // löst WahlSelectChangeEvent aus

    messages.addErrorMessage(messageKey);

    String startViewId = startViewResolver.getStartViewId();

    if (FacesContextUtil.getFacesContext() != null) { // Nur für Integration-Tests relevant
      FacesContextUtil.redirectToView(startViewId);
    }
  }

  @Override
  public boolean isSetzenErlaubt(Wahl entity) {
    return super.isSetzenErlaubt(entity) && (entity==null || entity.isRechtZumEinsehenVorhanden(principal)) && (entity==null || entity.isMandantStimmtUeberein(principal));
  }
}
