
package de.ivu.elect.presentation.wahlvorschlagsperson;

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

import de.ivu.elect.business.security.UseCasePermission;
import de.ivu.elect.business.security.UseCaseSecure;
import de.ivu.elect.business.wahlvorschlag.entity.Wahlvorschlag;
import de.ivu.elect.business.wahlvorschlagsperson.boundary.WahlvorschlagsPersonPoolEdit;
import de.ivu.elect.business.wahlvorschlagsperson.boundary.WahlvorschlagsPersonPoolPersonenVerknuepfungResolver;
import de.ivu.elect.business.wahlvorschlagsperson.entity.WahlvorschlagsPerson;
import de.ivu.elect.jee.presentation.dynamicform.FormBuilder;
import de.ivu.elect.jee.presentation.redirect.Redirect;
import de.ivu.elect.presentation.person.PersonendatenFormatter;
import de.ivu.elect.presentation.wahlvorschlagsperson.form.AbstractWahlvorschlagsPersonViewFormBuilder;

public abstract class AbstractDynaFormWahlvorschlagsPersonEditView extends AbstractWahlvorschlagsPersonEditView {

  private static final long serialVersionUID = 1L;

  @Inject
  private transient WahlvorschlagsPersonPoolEdit wahlvorschlagsPersonPoolEdit;

  @Inject
  private transient WahlvorschlagsPersonPoolPersonenVerknuepfungResolver wahlvorschlagsPersonPoolPersonenVerknuepfungResolver;

  @Inject
  private transient PersonendatenFormatter personendatenFormatter;

  public AbstractDynaFormWahlvorschlagsPersonEditView() {
    super();
  }

  public String getWahlvorschlagKennwort() {
    return getWahlvorschlag().getKennwort();
  }

  protected Wahlvorschlag getWahlvorschlag() {
    return getEntity().getWahlvorschlag();
  }

  private boolean isWahlvorschlagsPersonPoolPersonendatenSelected() {
    return wahlvorschlagsPersonPoolPersonenVerknuepfungResolver.getWahlvorschlagsPersonenVerknuepft(getEntity()).size() > 1;
  }

  @Override
  @Redirect
  @UseCaseSecure(UseCasePermission.WAHLVORSCHLAGS_PERSON_EDIT)
  public String save() {
    if (isWahlvorschlagsPersonPoolPersonendatenSelected()) {
      WahlvorschlagsPerson wahlvorschlagsPerson = getEntity();

      wahlvorschlagsPersonPoolEdit.saveAndUpdateWahlvorschlagsPersonenVerknuepft(wahlvorschlagsPerson);

      addMessageSaveSuccess(wahlvorschlagsPerson);

      conversationStore.close();

      return goBack(getParentViewId());
    }

    return super.save();
  }

  @Override
  public void addProperties(FormBuilder formBuilder, WahlvorschlagsPerson wahlvorschlagsPerson) {
    getWahlvorschlagsPersonViewFormBuilder().addProperties(formBuilder, wahlvorschlagsPerson);
  }

  protected abstract AbstractWahlvorschlagsPersonViewFormBuilder getWahlvorschlagsPersonViewFormBuilder();

  @Nullable
  public String getWahlvorschlagsPersonFamiliennameVorname() {
    if (isEntitySet()) {
      return personendatenFormatter.getFamiliennameVornameKommasepariert(getEntity()); // ELECTVAPP-1158
    }

    return null;
  }

  @Nullable
  public String getWahlvorschlagsPersonTyp() {
    if (isEntitySet()) {
      return getMessage(getEntity().getWahlvorschlagsPersonTyp());
    }

    return null;
  }
}
