
package de.ivu.elect.presentation.kandidatur;

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

import de.ivu.elect.business.gebietsbaum.entity.Gebiet;
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.person.entity.Personendaten;
import de.ivu.elect.presentation.kandidatur.form.ErsatzkandidaturViewFormBuilder;
import de.ivu.elect.presentation.personenregister.AbstractPersonenregisterPersonendatenSelectionViewCreateViewHelper;

public class ErsatzkandidaturCreateViewHelper extends AbstractPersonenregisterPersonendatenSelectionViewCreateViewHelper<Ersatzkandidatur> {

  private static final long serialVersionUID = 1L;

  @Inject
  protected transient KandidaturConversationSelect uebergeordneteKandidaturSelect;

  @Inject
  protected transient KandidaturCreateViewHelper kandidaturCreateViewHelper;

  @Inject
  protected transient ErsatzkandidaturCreateViewResolver ersatzkandidaturCreateViewResolver;

  @Inject
  protected transient ErsatzkandidaturViewFormBuilder ersatzkandidaturViewFormBuilder;

  public ErsatzkandidaturCreateViewHelper() {
    super();
  }

  public void preRenderView() {
    kandidaturCreateViewHelper.checkAutoCompleteOptionsExist(getSelectedWahl());
  }

  @Override
  @Nullable
  public String checkPreCondition() {
    if (isGebietSelected() && isUebergeordneteKandidaturForGebietSelected(getSelectedGebiet()) && isUebergeordneteKandidaturSupportingErsatzkandidatur(getSelectedGebiet())) {
      return null;
    }

    return cancel();
  }

  @Override
  public String getParentViewId() {
    if (isErsatzkandidaturForListenkandidatur()) {
      return ListenkandidaturSearchView.VIEW_ID;
    }

    if (isErsatzkandidaturForDirektkandidatur()) {
      return DirektkandidaturSearchView.VIEW_ID;
    }

    return getStartViewId();
  }

  @Override
  public String getViewId() {
    return AbstractErsatzkandidaturCreateNoScopeView.VIEW_ID;
  }

  @Override
  protected ErsatzkandidaturViewFormBuilder getViewFormBuilder() {
    return ersatzkandidaturViewFormBuilder;
  }

  @Override
  public String getEntityEinzahlMessage() {
    return getViewFormBuilder().getEntityEinzahlMessage(getSelectedGebiet());
  }

  private boolean isUebergeordneteKandidaturForGebietSelected(Gebiet gebiet) {
    return isUebergeordneteKandidaturSelected() && gebiet.equals(getSelectedUebergeordneteKandidatur().getGebiet());
  }

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

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

  private boolean isUebergeordneteKandidaturSupportingErsatzkandidatur(Gebiet gebiet) {
    return ersatzkandidaturCreateViewResolver.isUntergeordneteErsatzkandidaturCreatable(gebiet.getWahl(), getSelectedUebergeordneteKandidatur());
  }

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

  private boolean isErsatzkandidaturForDirektkandidatur() {
    return isUebergeordneteKandidaturSelected() && getWahlvorschlagKandidatur().isDirektkandidatur();
  }

  public String getUebergeordneteKandidaturName() {
    return getSelectedUebergeordneteKandidatur().getFamilienname();
  }

  public Kandidatur getWahlvorschlagKandidatur() {
    if (isUebergeordneteKandidaturSelected() && getSelectedUebergeordneteKandidatur().isErsatzkandidatur()) {
      return ((Ersatzkandidatur) getSelectedUebergeordneteKandidatur()).getWahlvorschlagKandidatur();
    }

    return getSelectedUebergeordneteKandidatur();
  }

  public void init(Gebiet gebiet, Ersatzkandidatur ersatzkandidatur) {
    kandidaturCreateViewHelper.initKandidatur(gebiet, ersatzkandidatur);

    ersatzkandidatur.setSelectedUebergeordneteKandidatur(getSelectedUebergeordneteKandidatur());
  }

  protected void tryAttachStaatsangehoerigkeiten(Personendaten personendaten) {
    kandidaturCreateViewHelper.tryAttachStaatsangehoerigkeiten(personendaten);
  }
}
