
package de.ivu.elect.presentation.stimmeingabe;

import javax.enterprise.context.RequestScoped;
import javax.inject.Inject;
import javax.inject.Named;

import de.ivu.elect.business.gebietsbaum.boundary.GebietNichtAusgewaehltException;
import de.ivu.elect.business.gebietsbaum.boundary.GebietSessionSelect;
import de.ivu.elect.business.gebietsbaum.entity.Gebiet;
import de.ivu.elect.business.security.UseCasePermission;
import de.ivu.elect.jee.exception.ElectCommonException;
import de.ivu.elect.jee.faces.PreConditionCheck;
import de.ivu.elect.jee.presentation.view.AbstractView;
import de.ivu.elect.presentation.View;
import de.ivu.elect.presentation.gebietsbaum.GebietNummerFormatter;
import de.ivu.elect.presentation.hilfe.OnlineHilfeId;

@OnlineHilfeId(value = "342", mehrfachVergebenOk = true)
@RequestScoped
@Named(StimmeingabeErfassenView.COMPONENT_NAME)
@View(viewId = StimmeingabeErfassenView.VIEW_ID, useCase = UseCasePermission.STIMMEINGABE_ANZEIGEN)
public class StimmeingabeErfassenView extends AbstractView {

  private static final long serialVersionUID = 1L;

  public static final String COMPONENT_NAME = "stimmeingabeErfassenView";

  public static final String VIEW_ID = "/stimmeingabe/stimmeingabe-erfassen.xhtml";

  @Inject
  private transient GebietSessionSelect gebietSelect;

  @Inject
  private transient StimmeingabeErfassenViewResolver stimmeingabeErfassenViewResolver;

  @Inject
  private transient GebietNummerFormatter gebietNummerFormatter;

  public StimmeingabeErfassenView() {
    super();
  }

  @PreConditionCheck
  public String checkPreCondition() {
    if (isGebietSelected()) {
      return tryRedirectToApplicableView();
    }

    throw new GebietNichtAusgewaehltException();
  }

  private String tryRedirectToApplicableView() {
    if (stimmeingabeErfassenViewResolver.isViewAvailable()) {
      return stimmeingabeErfassenViewResolver.getViewId();
    }

    throw new ElectCommonException("Bitte beachten Sie, dass zur ausgewählten Wahl noch keine Erfassungsmaske existiert!");
  }

  private boolean isGebietSelected() {
    return gebietSelect.isSelected();
  }

  private Gebiet getGebiet() {
    return gebietSelect.getEntity();
  }

  public String getGebietName() {
    return gebietNummerFormatter.getDarstellung(getGebiet());
  }
}
