
package de.ivu.elect.presentation.search;

import static org.apache.commons.lang3.StringUtils.isBlank;

import java.io.Serializable;

import javax.annotation.Nullable;
import javax.inject.Inject;
import javax.inject.Named;

import org.apache.deltaspike.core.api.scope.ViewAccessScoped;

import de.ivu.elect.business.search.boundary.BaseBenutzerSuchparameterBoundaryCreate;
import de.ivu.elect.business.search.boundary.BenutzerSuchparameterExtendedDAO;
import de.ivu.elect.business.search.control.DefaultBenutzerSuchparameterAnlegen;
import de.ivu.elect.business.search.entity.BenutzerSuchparameter;
import de.ivu.elect.business.security.UseCasePermission;
import de.ivu.elect.business.security.control.ElectCommonPrincipal;
import de.ivu.elect.business.wahl.boundary.WahlSessionSelector;
import de.ivu.elect.business.wahl.boundary.WahlterminSessionSelect;
import de.ivu.elect.business.wahl.entity.Wahl;
import de.ivu.elect.business.wahl.entity.Wahltermin;
import de.ivu.elect.jee.faces.FacesContextUtil;
import de.ivu.elect.jee.faces.FacesMessageUtil;
import de.ivu.elect.jee.presentation.redirect.Redirect;
import de.ivu.elect.presentation.ViewHavingSuchparameterSpeicherbar;

@ViewAccessScoped
@Named(BenutzerSuchparameterAnlegen.COMPONENT_NAME)
public class BenutzerSuchparameterAnlegen implements Serializable {

  private static final long serialVersionUID = 1L;

  public static final String COMPONENT_NAME = "benutzerSuchparameterAnlegen";

  @Inject
  private transient ElectCommonPrincipal principal;

  @Inject
  private transient BenutzerSuchparameterExtendedDAO benutzerSuchparameterExtendedDAO;

  @Inject
  private transient BaseBenutzerSuchparameterBoundaryCreate benutzerSuchparameterCreate;

  @Inject
  private transient WahlSessionSelector wahlSessionSelect;

  @Inject
  private transient WahlterminSessionSelect wahlterminSessionSelect;

  private String vorlagenName;

  public BenutzerSuchparameterAnlegen() {
    super();
  }

  public String getVorlagenName() {
    return vorlagenName;
  }
 
  public void setVorlagenName(String vorlagenName) {
    this.vorlagenName = vorlagenName;
  }

  public boolean isBtnSaveRendered(Object view) {
    return view != null && principal.hasUseCasePermission(UseCasePermission.BENUTZER_SUCHPARAMETER_CREATE) && (isWahlSelected() || isWahlterminSelected());
  }

  @Redirect
  public String save(Object view) {
    String name = getVorlagenName();

    if (isBtnSaveRendered(view)) {
      BenutzerSuchparameter benutzerSuchparameter = createBenutzerSuchparameter(view);
      benutzerSuchparameter.setName(name);

      if (isBlank(benutzerSuchparameter.getSuchparameter())) {
        return FacesContextUtil.getCurrentViewId();
      }

      if (vorhanden(benutzerSuchparameter)) {
        FacesMessageUtil.addErrorMessage("benutzer.suchvorlage.create.action.save.error.vorhanden", (Object) name);
      } else {
        benutzerSuchparameterCreate.save(benutzerSuchparameter);

        FacesMessageUtil.addInfoMessage("benutzer.suchvorlage.create.action.save.success.message", (Object) benutzerSuchparameter.getName());
      }

      setVorlagenName(null);
    }

    return FacesContextUtil.getCurrentViewId();
  }

  public boolean isBtnSaveAlsDefaultRendered(Object view) {
    return isBtnSaveRendered(view);
  }

  @Redirect
  public String saveAlsDefault(Object view) {
    if (isBtnSaveAlsDefaultRendered(view)) {
      BenutzerSuchparameter benutzerSuchparameter = createBenutzerSuchparameter(view);

      if (isBlank(benutzerSuchparameter.getSuchparameter())) {
        return FacesContextUtil.getCurrentViewId();
      }

      benutzerSuchparameterCreate.saveAlsDefault(benutzerSuchparameter);

      FacesMessageUtil.addInfoMessage("benutzer.suchvorlage.create.als.default.action.save.success.message", (Object) benutzerSuchparameter.getName());
    }

    return FacesContextUtil.getCurrentViewId();
  }

  private BenutzerSuchparameter createBenutzerSuchparameter(Object view) {
    BenutzerSuchparameter benutzerSuchparameter = new BenutzerSuchparameter();
    benutzerSuchparameter.setBenutzerkennung(principal.getLogin().getBenutzerkennung());
    benutzerSuchparameter.setWahltermin(getSelectedWahltermin());

    if (isWahlSelected()) {
      Wahl wahl = getSelectedWahl();

      benutzerSuchparameter.setWahltermin(wahl.getWahltermin());
      benutzerSuchparameter.setWahl(wahl);
    }

    benutzerSuchparameter.setViewId(FacesContextUtil.getCurrentViewId());
    benutzerSuchparameter.setSuchparameter(extractSuchparameterState(view));

    return benutzerSuchparameter;
  }

  private boolean vorhanden(BenutzerSuchparameter benutzerSuchparameter) {
    return DefaultBenutzerSuchparameterAnlegen.vorhanden(benutzerSuchparameter, benutzerSuchparameterExtendedDAO);
  }

  @Nullable
  protected String extractSuchparameterState(Object view) {
    if (view instanceof ViewHavingSuchparameterSpeicherbar) {
      return ((ViewHavingSuchparameterSpeicherbar) view).getSuchparameterState();
    }

    return null;
  }

  private boolean isWahlSelected() {
    return wahlSessionSelect.isSelected();
  }

  private Wahl getSelectedWahl() {
    return wahlSessionSelect.getEntity();
  }

  private boolean isWahlterminSelected() {
    return wahlterminSessionSelect.isSelected();
  }

  private Wahltermin getSelectedWahltermin() {
    return wahlterminSessionSelect.getEntity();
  }
}
