
package de.ivu.elect.presentation.kandidatur;

import static de.ivu.elect.jee.entity.EntityUtil.castTo;

import java.io.Serializable;

import javax.inject.Inject;

import de.ivu.elect.business.kandidatur.boundary.ErsatzkandidaturPruefer;
import de.ivu.elect.business.kandidatur.entity.Direktkandidatur;
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.mandant.entity.Mandant;
import de.ivu.elect.business.personenregister.boundary.PersonenregisterSwitch;
import de.ivu.elect.business.wahl.entity.Wahl;

public class ErsatzkandidaturCreateViewResolver implements Serializable {

  private static final long serialVersionUID = 1L;

  @Inject
  private transient PersonenregisterSwitch personenregisterSwitch;

  @Inject
  private transient ErsatzkandidaturPruefer ersatzkandidaturPruefer;

  public ErsatzkandidaturCreateViewResolver() {
    super();
  }

  public String getViewId(Mandant mandant) {
    if (isPersonenregisterAvailable(mandant)) {
      return ErsatzkandidaturPersonenregisterPersonendatenSelectionView.VIEW_ID;
    }

    return ErsatzkandidaturCreateView.VIEW_ID;
  }

  private boolean isPersonenregisterAvailable(Mandant mandant) {
    return personenregisterSwitch.isPersonenregisterAvailable(mandant);
  }

  public boolean isUntergeordneteErsatzkandidaturCreatable(Wahl wahl, Kandidatur kandidatur) {
    if (kandidatur != null) {
      if (kandidatur.isListenkandidatur()) {
        return isUntergeordneteErsatzkandidaturCreatable(wahl, castTo(kandidatur, Listenkandidatur.class));
      }

      if (kandidatur.isDirektkandidatur()) {
        return isUntergeordneteErsatzkandidaturCreatable(wahl, castTo(kandidatur, Direktkandidatur.class));
      }

      if (kandidatur.isErsatzkandidatur()) {
        return isUntergeordneteErsatzkandidaturCreatable(wahl, castTo(kandidatur, Ersatzkandidatur.class));
      }
    }

    return false;
  }

  public boolean isUntergeordneteErsatzkandidaturCreatable(Wahl wahl, Listenkandidatur listenkandidatur) {
    return getErsatzkandidaturPruefer().checkUntergeordneteErsatzkandidaturHinzufuegen(wahl, listenkandidatur).isWeitereErsatzkandidaturZulaessig();
  }

  public boolean isUntergeordneteErsatzkandidaturCreatable(Wahl wahl, Direktkandidatur direktkandidatur) {
    return getErsatzkandidaturPruefer().checkUntergeordneteErsatzkandidaturHinzufuegen(wahl, direktkandidatur).isWeitereErsatzkandidaturZulaessig();
  }

  public boolean isUntergeordneteErsatzkandidaturCreatable(Wahl wahl, Ersatzkandidatur ersatzkandidatur) {
    return getErsatzkandidaturPruefer().checkUntergeordneteErsatzkandidaturHinzufuegen(wahl, ersatzkandidatur).isWeitereErsatzkandidaturZulaessig();
  }

  protected ErsatzkandidaturPruefer getErsatzkandidaturPruefer() {
    return ersatzkandidaturPruefer;
  }
}
