package de.ivu.elect.presentation.wahlbeteiligung;

import java.util.Date;

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

import de.ivu.elect.business.security.UseCasePermission;
import de.ivu.elect.business.wahlbeteiligung.boundary.WasWahlbeteiligungAuswertungBoundaryCreate;
import de.ivu.elect.business.wahlbeteiligung.entity.WahlbeteiligungAuswertung;
import de.ivu.elect.business.wahlbeteiligung.entity.WahlbeteiligungAuswertungStatus;
import de.ivu.elect.business.wahlbeteiligung.entity.WahlbeteiligungAuswertungTyp;
import de.ivu.elect.business.wahlbeteiligung.entity.WahlbeteiligungAuswertungWahllokalsystemCreateParameters;
import de.ivu.elect.jee.faces.PreConditionCheck;
import de.ivu.elect.jee.presentation.dynamicform.FormBuilder;
import de.ivu.elect.jee.presentation.dynamicform.LambdaBooleanProperty;
import de.ivu.elect.jee.presentation.dynamicform.LambdaLongProperty;
import de.ivu.elect.jee.presentation.redirect.Redirect;
import de.ivu.elect.presentation.View;
import de.ivu.elect.presentation.hilfe.OnlineHilfeId;
import de.ivu.elect.presentation.wahlbeteiligung.form.WahlbeteiligungAuswertungViewFormBuilder;

@RequestScoped
@Named(WahlbeteiligungAuswertungWahllokalsystemCreateView.COMPONENT_NAME)
@View(viewId = WahlbeteiligungAuswertungWahllokalsystemCreateView.VIEW_ID, useCase = UseCasePermission.WAHLBETEILIGUNG_AUSWERTUNG_WAHLLOKALSYSTEM_CREATE)
@OnlineHilfeId("763")
public class WahlbeteiligungAuswertungWahllokalsystemCreateView extends AbstractWahlbeteiligungAuswertungCreateNoScopeView {

  public static final String COMPONENT_NAME = "wahlbeteiligungAuswertungWahllokalsystemCreateView";

  public static final String VIEW_ID = "/wahlbeteiligung/wahlbeteiligung-auswertung-wahllokalsystem-create.xhtml";

  public static final String PARENT_VIEW_ID = "/wahlbeteiligung/wahlbeteiligung-auswertung-search.xhtml";

  private static final long serialVersionUID = 1L;

  @Inject
  private transient WasWahlbeteiligungAuswertungBoundaryCreate wasWahlbeteiligungAuswertungBoundaryCreate;

  @Inject
  private transient WahlbeteiligungAuswertungViewFormBuilder wahlbeteiligungAuswertungViewFormBuilder;

  private WahlbeteiligungAuswertungWahllokalsystemCreateParameters wahlbeteiligungAuswertungWahllokalsystemCreateParameters;

  @Nullable
  @PreConditionCheck
  public String checkCondition() {
    if (!isWahlSelected()) {
      return getStartViewId();
    }

    return null;
  }

  @Override
  protected void setEntity(WahlbeteiligungAuswertung entity) {
    entity.setStatus(WahlbeteiligungAuswertungStatus.AUTOMATISCHE_UEBERNAHME_ERFOLGT);
    entity.setTyp(WahlbeteiligungAuswertungTyp.AUTOMATISCH);
    entity.setDatum(new Date());
    super.setEntity(entity);
    wahlbeteiligungAuswertungWahllokalsystemCreateParameters = new WahlbeteiligungAuswertungWahllokalsystemCreateParameters(getPrincipal().getBenutzerKennung());
  }

  @Override
  protected String getViewId() {
    return VIEW_ID;
  }

  @Override
  protected String getParentViewId() {
    return PARENT_VIEW_ID;
  }

  @Override
  protected void addProperties(FormBuilder formBuilder, WahlbeteiligungAuswertung entity) {
    wahlbeteiligungAuswertungViewFormBuilder.addProperties(formBuilder, entity);
    formBuilder.addProperty(new LambdaBooleanProperty(getMessage("wahlbeteiligung.auswertung.wahllokalsystem.create.zukuenftige.werte.beruecksichtigen"), true,
        getWahlbeteiligungAuswertungWahllokalsystemCreateParameters()::setNeuereWerteBeruecksichtigen,
        getWahlbeteiligungAuswertungWahllokalsystemCreateParameters()::isNeuereWerteBeruecksichtigen));
    formBuilder.addProperty(new LambdaLongProperty(getMessage("wahlbeteiligung.auswertung.wahllokalsystem.create.maximale.abweichung"), true,
        getWahlbeteiligungAuswertungWahllokalsystemCreateParameters()::setMaximaleAbweichungZurueckliegendeWerteInMinuten,
        getWahlbeteiligungAuswertungWahllokalsystemCreateParameters()::getMaximaleAbweichungZurueckliegendeWerteInMinuten, 0L, 99999L));
  }

  @Override
  protected void callSave(WahlbeteiligungAuswertung entity) {
    entity.setWahl(getSelectedWahl());
    wasWahlbeteiligungAuswertungBoundaryCreate.saveWahllokalsystem(entity,getWahlbeteiligungAuswertungWahllokalsystemCreateParameters() );
  }

  @Override
  @Redirect
  public String reset() {
    wahlbeteiligungAuswertungWahllokalsystemCreateParameters = null;
    return super.reset();
  }

  public WahlbeteiligungAuswertungWahllokalsystemCreateParameters getWahlbeteiligungAuswertungWahllokalsystemCreateParameters() {
    if (wahlbeteiligungAuswertungWahllokalsystemCreateParameters == null) {
      wahlbeteiligungAuswertungWahllokalsystemCreateParameters = new WahlbeteiligungAuswertungWahllokalsystemCreateParameters(getPrincipal().getBenutzerKennung());
    }
    return wahlbeteiligungAuswertungWahllokalsystemCreateParameters;
  }
}
