
package de.ivu.elect.presentation.kandidatur;

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

import de.ivu.elect.business.kandidatur.boundary.KandidaturConversationSelect;
import de.ivu.elect.business.kandidatur.entity.Ersatzkandidatur;
import de.ivu.elect.business.kandidatur.entity.Kandidatur;
import de.ivu.elect.business.kandidatur.entity.Listenkandidatur;
import de.ivu.elect.business.person.entity.Personendaten;
import de.ivu.elect.business.personenregister.boundary.PersonenregisterByPersonendatenSearchParameters;
import de.ivu.elect.business.personenregister.boundary.PersonenregisterPersonendatenConversationSelect;
import de.ivu.elect.business.personenregister.control.KandidaturPersonenregisterPersonendatenMapper;
import de.ivu.elect.business.personenregister.entity.PersonenregisterPersonendaten;
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.hilfe.OnlineHilfeId;
import de.ivu.elect.presentation.kandidatur.form.ErsatzkandidaturViewFormBuilder;

@OnlineHilfeId(value = "260", mehrfachVergebenOk = true)
@Named(ErsatzkandidaturCreateView.COMPONENT_NAME)
public class ErsatzkandidaturCreateView extends AbstractErsatzkandidaturCreateView {

  private static final long serialVersionUID = 1L;

  @Inject
  protected transient KandidaturConversationSelect uebergeordneteKandidaturSelect;

  @Inject
  protected transient PersonenregisterPersonendatenConversationSelect personenregisterPersonendatenSelect;

  @Inject
  protected transient KandidaturPersonenregisterPersonendatenMapper kandidaturPersonenregisterPersonendatenMapper;

  @Inject
  protected transient ErsatzkandidaturCreateViewHelper ersatzkandidaturCreateViewHelper;

  public ErsatzkandidaturCreateView() {
    super();
  }

  public void preRenderView() {
    ersatzkandidaturCreateViewHelper.preRenderView();
  }

  @PreConditionCheck
  public String checkPreCondition() {
    return ersatzkandidaturCreateViewHelper.checkPreCondition();
  }

  @Override
  protected String getParentViewId() {
    return ersatzkandidaturCreateViewHelper.getParentViewId();
  }

  private boolean isUebergeordneteKandidaturSelected() {
    return uebergeordneteKandidaturSelect.isSelected();
  }

  private Kandidatur getUebergeordneteKandidatur() {
    return uebergeordneteKandidaturSelect.getEntity();
  }

  private boolean isErsatzkandidaturForListenkandidatur() {
    return isUebergeordneteKandidaturSelected() && getWahlvorschlagKandidatur().isListenkandidatur();
  }

  private Kandidatur getWahlvorschlagKandidatur() {
    return ersatzkandidaturCreateViewHelper.getWahlvorschlagKandidatur();
  }

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

  public String getUebergeordneteKandidaturName() {
    return ersatzkandidaturCreateViewHelper.getUebergeordneteKandidaturName();
  }

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

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

    ersatzkandidaturCreateViewHelper.init(getSelectedGebiet(), getEntity());

    tryPresetPersonenregisterPersonendaten();
  }

  private void tryPresetPersonenregisterPersonendaten() {
    if (isPersonenregisterPersonendatenSelected()) {
      initPersonenregisterPersonendaten(getPersonenregisterPersonendaten());
    } else if (isPersonenregisterByPersonendatenSearchParametersSelected()) {
      initPersonenregisterPersonendaten(getPersonenregisterByPersonendatenSearchParameters());
    }
  }

  private boolean isPersonenregisterPersonendatenSelected() {
    return personenregisterPersonendatenSelect.isPersonenregisterPersonendatenSelected();
  }

  private PersonenregisterPersonendaten getPersonenregisterPersonendaten() {
    return personenregisterPersonendatenSelect.getPersonenregisterPersonendaten();
  }

  private void initPersonenregisterPersonendaten(PersonenregisterPersonendaten personenregisterPersonendaten) {
    Personendaten personendaten = getEntity();

    kandidaturPersonenregisterPersonendatenMapper.mapManuelleAuswahl(getEntity(), personenregisterPersonendaten);
    ersatzkandidaturCreateViewHelper.tryAttachStaatsangehoerigkeiten(personendaten);
  }

  private boolean isPersonenregisterByPersonendatenSearchParametersSelected() {
    return personenregisterPersonendatenSelect.isPersonenregisterByPersonendatenSearchParametersSelected();
  }

  private PersonenregisterByPersonendatenSearchParameters getPersonenregisterByPersonendatenSearchParameters() {
    return personenregisterPersonendatenSelect.getPersonenregisterByPersonendatenSearchParameters();
  }

  private void initPersonenregisterPersonendaten(PersonenregisterByPersonendatenSearchParameters searchParameters) {
    Personendaten personendaten = getEntity();
    personendaten.setFamilienname(searchParameters.getFamilienname());
    personendaten.setRufname(searchParameters.getVorname());
    personendaten.setGeburtsdatum(searchParameters.getGeburtsdatum());
    personendaten.setGeschlecht(searchParameters.getGeschlecht());
  }

  @Override
  public void addProperties(FormBuilder formBuilder, Ersatzkandidatur entity) {
    boolean readonly = false;

    if (isErsatzkandidaturForListenkandidatur()) {
      addListenkandidaturProperties(formBuilder);
    }

    addKandidaturProperties(formBuilder, readonly);
    addGewaehltVorperiodeProperties(formBuilder, readonly);
  }

  protected void addListenkandidaturProperties(FormBuilder formBuilder) {
    getViewFormBuilder().addListenkandidaturProperties(formBuilder, (Listenkandidatur) getWahlvorschlagKandidatur());
  }

  protected void addKandidaturProperties(FormBuilder formBuilder, boolean readonly) {
    getViewFormBuilder().addKandidaturProperties(formBuilder, getEntity(), readonly);
  }

  protected void addGewaehltVorperiodeProperties(FormBuilder formBuilder, boolean readonly) {
    getViewFormBuilder().addGewaehltVorperiodeProperties(formBuilder, getEntity(), getEntity().getGewaehltVorperiode(), readonly);
  }

  @Override
  @Redirect
  @UseCaseSecure(UseCasePermission.ERSATZKANDIDATUR_CREATE)
  public String save() {
    Ersatzkandidatur ersatzkandidatur = getEntity();
    ersatzkandidatur.setUebergeordneteKandidatur(getUebergeordneteKandidatur());

    getViewFormBuilder().preSaveEntity(ersatzkandidatur);

    super.save();

    return goBack(getParentViewId());
  }

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

    if (personenregisterPersonendatenSelect.isSelected()) {
      personenregisterPersonendatenSelect.clear();
    }

    return getParentViewId();
  }

  protected ErsatzkandidaturViewFormBuilder getViewFormBuilder() {
    return ersatzkandidaturCreateViewHelper.getViewFormBuilder();
  }

  @Override
  protected FormBuilder createFormBuilder() {
    return new FormBuilder(formBuilderConfig);
  }
}
