
package de.ivu.elect.presentation.gruppe;

import static de.ivu.elect.business.gruppe.entity.GruppeArt.PARTEI;

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

import de.ivu.elect.business.gruppe.entity.PolitischeGruppe;
import de.ivu.elect.business.wahl.boundary.WahlNichtAusgewaehltException;
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.gruppe.form.CoreGruppeViewFormBuilder;
import de.ivu.elect.presentation.hilfe.OnlineHilfeId;
import org.apache.commons.lang3.StringUtils;
import org.apache.deltaspike.core.api.scope.ViewAccessScoped;

@OnlineHilfeId("229")
@ViewAccessScoped
@Named(GruppeCreateView.COMPONENT_NAME)
public class GruppeCreateView extends AbstractPolitischeGruppeCreateView {

  private static final long serialVersionUID = 1L;

  protected static final String PARENT_VIEW_ID = AbstractGruppeSearchView.VIEW_ID;

  @Inject
  private transient CoreGruppeViewFormBuilder gruppeViewFormBuilder;

  private String redirectViewId = null;
  private String nameVorbelegt = null;
  private String kurznameVorbelegt = null;
  private String zusatzbezeichnungVorbelegt = null;

  public GruppeCreateView() {
    super();
  }

  @PreConditionCheck
  public String checkWahlSelected() {
    if (isWahlSelected()) {
      if (!getSelectedWahl().isWahlMitKandidaturen()) {
        return cancel();
      }

      return null;
    }

    throw new WahlNichtAusgewaehltException();
  }

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

    initEntity();
  }

  private void initEntity() {
    PolitischeGruppe politischeGruppe = getEntity();

    politischeGruppe.setWahl(getSelectedWahl());
    politischeGruppe.setGruppeArt(PARTEI);
    politischeGruppe.setInPraesentation(true);
  }

  @Override
  public void addProperties(FormBuilder formBuilder, PolitischeGruppe politischeGruppe) {
    gruppeViewFormBuilder.addProperties(formBuilder, politischeGruppe, false);
  }

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

    if (StringUtils.isNotBlank(redirectViewId)) {
      return redirectViewId;
    }

    return PARENT_VIEW_ID;
  }

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

    if (StringUtils.isNotBlank(redirectViewId)) {
      return redirectViewId;
    }

    return PARENT_VIEW_ID;
  }

  @Redirect
  public String vorbelegenUndRedirect(String redirectAfterFinishViewId, String name, String kurzname, String zusatzbezeichnung) {
    redirectViewId = redirectAfterFinishViewId;
    nameVorbelegt = name;
    kurznameVorbelegt = kurzname;
    zusatzbezeichnungVorbelegt = zusatzbezeichnung;
    return VIEW_ID;
  }

  @Override
  public PolitischeGruppe getEntity() {
    PolitischeGruppe politischeGruppe = super.getEntity();

    politischeGruppe.setWahl(getSelectedWahl());

    if (StringUtils.isNotBlank(redirectViewId)) {
      if (StringUtils.isBlank(politischeGruppe.getName())) {
        politischeGruppe.setName(nameVorbelegt);
      }
      if (StringUtils.isBlank(politischeGruppe.getKurzname())) {
        politischeGruppe.setKurzname(kurznameVorbelegt);
      }
      if (StringUtils.isBlank(politischeGruppe.getZusatzbezeichnung())) {
        politischeGruppe.setZusatzbezeichnung(zusatzbezeichnungVorbelegt);
      }
    }

    return politischeGruppe;
  }
}
