
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.Wahltermin;
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;

/**
 *  on 19.02.2016.
 */
@Specializes
public class ElectBaseWahlterminSessionSelect extends WahlterminSessionSelect {

  private static final long serialVersionUID = 1L;

  @Inject
  private transient ElectCommonPrincipal principal;

  @Inject
  protected transient Messages messages;

  @Inject
  protected transient StartViewResolver startViewResolver;

  public ElectBaseWahlterminSessionSelect() {
    super();
  }

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

  @Override
  public Wahltermin getEntity() {
    Wahltermin wahltermin = super.getEntity();

    if (nonNull(wahltermin) && !wahltermin.getStatus().isAuswaehlbar()) {
      clearWahlterminSelectUndRedirectToStartView("wahltermin.session.select.wahltermin.gesperrt");

      return null;
    }

    return wahltermin;
  }

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

    setEntity((Wahltermin) null); // löst WahlterminSelectChangeEvent aus

    messages.addErrorMessage(messageKey);

    String startViewId = startViewResolver.getStartViewId();

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


}
