
package de.ivu.elect.presentation.gruppeimgebiet;

import static java.util.Objects.isNull;

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

import de.ivu.elect.business.gruppe.boundary.PolitischeGruppeFactory;
import de.ivu.elect.business.gruppe.entity.GruppeArt;
import de.ivu.elect.business.gruppe.entity.GruppeProperties;
import de.ivu.elect.business.gruppe.entity.PolitischeGruppe;
import de.ivu.elect.business.gruppe.entity.ReferendumVorlageMeta;
import de.ivu.elect.business.gruppeimgebiet.boundary.GruppeImGebietExtendedDAO;
import de.ivu.elect.business.gruppeimgebiet.boundary.ReferendumVorlageImGebietCreate;
import de.ivu.elect.business.gruppeimgebiet.entity.GruppeImGebiet;
import de.ivu.elect.business.security.UseCasePermission;
import de.ivu.elect.business.security.UseCaseSecure;
import de.ivu.elect.business.wahl.entity.Wahl;
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.gruppe.form.UniqueGruppeSchluesselFacesValidator;
import de.ivu.elect.presentation.gruppeimgebiet.form.ReferendumVorlageImGebietViewFormBuilder;
import de.ivu.elect.presentation.hilfe.OnlineHilfeId;

@OnlineHilfeId(value = "782", mehrfachVergebenOk = true)
@Named(ReferendumVorlageImGebietCreateView.COMPONENT_NAME)
@View(viewId = ReferendumVorlageImGebietCreateView.VIEW_ID, useCase = UseCasePermission.REFERENDUM_VORLAGE_CREATE)
public class ReferendumVorlageImGebietCreateView extends AbstractGruppeImGebietCreateView {

  private static final long serialVersionUID = 1L;

  public static final String COMPONENT_NAME = "referendumVorlageImGebietCreateView";

  public static final String VIEW_ID = "/gruppeimgebiet/referendum-vorlage-im-gebiet-create.xhtml";

  private static final String PARENT_VIEW_ID = ReferendumVorlageImGebietSearchView.VIEW_ID;

  @Inject
  private GruppeImGebietExtendedDAO gruppeImGebietDao;

  @Inject
  private ReferendumVorlageImGebietCreate referendumVorlageImGebietCreate;

  @Inject
  private ReferendumVorlageMeta referendumVorlageMeta;

  @Inject
  private PolitischeGruppeFactory politischeGruppeFactory;

  @Inject
  private UniqueGruppeSchluesselFacesValidator uniqueSchluesselValidator;

  @Inject
  private ReferendumVorlageImGebietViewFormBuilder viewFormBuilder;

  public ReferendumVorlageImGebietCreateView() {
    super();
  }

  @PreConditionCheck
  public String checkPreCondition() {
    if (isReferendumgebietSelected()) {
      return null;
    }

    return cancel();
  }

  private boolean isReferendumgebietSelected() {
    return isGebietSelected() && getSelectedGebiet().isReferendumgebiet();
  }

  public String getGebietName() {
    return getSelectedGebietNameFormatted();
  }

  private Wahl getWahl() {
    return getSelectedGebiet().getWahl();
  }

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

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

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

    initReferendumVorlageImGebiet();
  }

  private void initReferendumVorlageImGebiet() {
    GruppeImGebiet referendumVorlageImGebiet = getEntity();

    referendumVorlageImGebiet.setGebiet(getSelectedGebiet());
    referendumVorlageImGebiet.setGruppe(createReferendumVorlage());
    referendumVorlageImGebiet.setRelativePosition(calculateNextRelativePosition());
  }

  private PolitischeGruppe createReferendumVorlage() {
    PolitischeGruppe referendumVorlage = politischeGruppeFactory.create();

    referendumVorlage.setGruppeArt(GruppeArt.REFERENDUM_VORLAGE);
    referendumVorlage.setWahl(getWahl());
    referendumVorlage.setMinderheit(Boolean.FALSE);
    referendumVorlage.setInPraesentation(Boolean.TRUE);

    return referendumVorlage;
  }

  private long calculateNextRelativePosition() {
    Long maxRelativePositionOrNull = gruppeImGebietDao.findByMaxRelativePosition(getSelectedGebiet(), GruppeArt.REFERENDUM_VORLAGE);

    if (isNull(maxRelativePositionOrNull)) {
      return 1L;
    }

    return maxRelativePositionOrNull + 1;
  }

  @Override
  public void addProperties(FormBuilder formBuilder, GruppeImGebiet referendumVorlageImGebiet) {
    viewFormBuilder.addProperties(formBuilder, referendumVorlageImGebiet);

    GruppeProperties referendumVorlageProperties = referendumVorlageImGebiet.getGruppe().getProperties();

    formBuilder.selectProperty(referendumVorlageProperties.getSchluesselProperty()).withValidator(uniqueSchluesselValidator);
  }

  @Override
  public boolean isBtnSaveRendered() {
    return hasPermission(UseCasePermission.REFERENDUM_VORLAGE_CREATE);
  }

  @Override
  @Redirect
  @UseCaseSecure(UseCasePermission.REFERENDUM_VORLAGE_CREATE)
  public String save() {
    GruppeImGebiet referendumVorlageImGebiet = getEntity();

    referendumVorlageImGebiet.setEingereichtePosition(referendumVorlageImGebiet.getRelativePosition());
    referendumVorlageImGebiet.setVorgegebenePosition(referendumVorlageImGebiet.getRelativePosition());

    referendumVorlageImGebietCreate.save(referendumVorlageImGebiet);

    addMessageSaveSuccess(referendumVorlageImGebiet);

    return goBack(getParentViewId());
  }

  @Override
  protected void addMessageSaveSuccess(GruppeImGebiet entity) {
    addInfoMessage("entity.create.action.save.success.message", referendumVorlageMeta.getEinzahlMessage());
  }
}
