package de.ivu.elect.presentation.stimmzettel;

import java.util.Date;

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

import de.ivu.elect.business.stimmzettel.entity.StimmzettelTeam;
import org.apache.deltaspike.core.api.scope.ConversationGroup;

import de.ivu.elect.business.gebietsbaum.boundary.GebietSessionSelect;
import de.ivu.elect.business.security.UseCasePermission;
import de.ivu.elect.business.stimmzettel.boundary.StimmzettelConversationStore;
import de.ivu.elect.business.stimmzettel.entity.Stimmzettel;
import de.ivu.elect.business.stimmzettel.entity.StimmzettelGueltigkeit;
import de.ivu.elect.jee.faces.PreConditionCheck;
import de.ivu.elect.jee.presentation.dynamicform.FormBuilder;
import de.ivu.elect.jee.presentation.redirect.Redirect;
import de.ivu.elect.presentation.View;
import de.ivu.elect.presentation.gebietsbaum.GebietNummerFormatter;
import de.ivu.elect.presentation.hilfe.OnlineHilfeId;
import de.ivu.elect.presentation.stimmzettel.form.StimmzettelViewFormBuilder;

@RequestScoped
@Named(AbstractStimmzettelCreateNoScopeView.COMPONENT_NAME)
@View(viewId = AbstractStimmzettelCreateNoScopeView.VIEW_ID, useCase = UseCasePermission.STIMMZETTEL_CREATE)
@OnlineHilfeId(value = "780", mehrfachVergebenOk = true)
public class StimmzettelCreateView extends AbstractStimmzettelCreateView {

  protected static final String PARENT_VIEW_ID = AbstractStimmzettelSearchView.VIEW_ID;

  @Inject
  private transient StimmzettelViewFormBuilder viewFormBuilder;

  @Inject
  private transient GebietSessionSelect gebietSessionSelect;

  @Inject
  private transient StimmzettelErfassungVerfuegbar stimmzettelErfassungVerfuegbar;

  @Inject
  private transient GebietNummerFormatter gebietNummerFormatter;

  @Inject
  @ConversationGroup(StimmzettelConversationStore.class)
  protected transient StimmzettelConversationStore conversationStore;


  @PreConditionCheck
  public String checkWahlSelected() {
    if (!stimmzettelErfassungVerfuegbar.isStimmzettelErfassungVerfuegbar() || !isErfassungsgebiet()) {
      return PARENT_VIEW_ID;
    }

    return null;
  }

  private boolean isErfassungsgebiet() {
    return gebietSessionSelect.isSelected() && gebietSessionSelect.getEntity().isErfassungsgebiet();
  }

  @Override
  @PostConstruct
  public void init() {
    super.init();

    initEntity();
  }

  private void initEntity() {
    Stimmzettel stimmzettel = getEntity();
    stimmzettel.setGebiet(gebietSessionSelect.getEntity());
    stimmzettel.setGueltigkeit(StimmzettelGueltigkeit.UNGUELTIG_PER_BESCHLUSS);
    stimmzettel.setStimmzettelTeam(StimmzettelTeam.UNBEKANNT);
    stimmzettel.setErfasser(getPrincipal().getName());
    stimmzettel.setErfassungszeitpunkt(new Date());
  }

  @Override
  public void addProperties(FormBuilder formBuilder, Stimmzettel stimmzettel) {
    viewFormBuilder.addProperties(formBuilder, stimmzettel);
  }

  @Override
  @Redirect
  public String save() {
    super.save();
    return StimmzettelEditView.VIEW_ID;
  }

  @Override
  protected void callSave(Stimmzettel entity) {
    super.callSave(entity);
    conversationStore.setEntityPK(getEntity().getPk());
  }

  @Override
  @Redirect
  public String cancel() {
    super.cancel();

    return PARENT_VIEW_ID;
  }

  public String getGebietNameMitNummer() {
    return gebietNummerFormatter.getDarstellung(gebietSessionSelect.getEntity());
  }

}
