
package de.ivu.elect.business.kandidatur.entity;

import de.ivu.elect.business.wahlvorschlag.entity.Wahlvorschlag;
import de.ivu.elect.jee.entity.customdata.CustomData;

public abstract class AbstractErsatzkandidatur extends Kandidatur implements ErsatzkandidaturBase {

  private static final long serialVersionUID = 1L;

  private transient Kandidatur selectedUebergeordneteKandidatur;

  public AbstractErsatzkandidatur() {
    super();
  }

  public AbstractErsatzkandidatur(CustomData customData) {
    super(customData);
  }

  public Kandidatur getSelectedUebergeordneteKandidatur() {
    return selectedUebergeordneteKandidatur;
  }

  public void setSelectedUebergeordneteKandidatur(Kandidatur selectedUebergeordneteKandidatur) {
    this.selectedUebergeordneteKandidatur = selectedUebergeordneteKandidatur;
  }

  @Override
  public Wahlvorschlag getWahlvorschlag() {
    Kandidatur wahlvorschlagKandidatur = getWahlvorschlagKandidatur();
    if (wahlvorschlagKandidatur == null) {
      return null;
    }
    return wahlvorschlagKandidatur.getWahlvorschlag();
  }

  /**
   * @return Gibt die Kandidatur zum Wahlvorschlag, also die eigentliche Direkt- oder Listenkandidatur, zurück.
   */
  public Kandidatur getWahlvorschlagKandidatur() {
    Kandidatur kandidatur = getUebergeordneteKandidatur();

    if (kandidatur == null) {
      kandidatur = getSelectedUebergeordneteKandidatur();
    }

    if (kandidatur != null && kandidatur.isErsatzkandidatur()) {
      return ((Ersatzkandidatur) kandidatur).getWahlvorschlagKandidatur();
    }

    return kandidatur;
  }

  @Override
  public String toString() {
    return super.toString() + " [Uebergeordnete Kandidatur " + getUebergeordneteKandidatur() + "]";
  }

  @Override
  public boolean isErsatzkandidatur() {
    return true;
  }

  @Override
  public Ersatzkandidatur getErsatzkandidatur() {
    return (Ersatzkandidatur) this;
  }

  public boolean isUebergeordneteKandidaturDerKlasse(Class<?> klasseDerUebergeordnetenKandidatur) {
    Kandidatur uebergeordneteKandidatur = getUebergeordneteKandidatur();
    return uebergeordneteKandidatur != null && uebergeordneteKandidatur.isInstanceOf(klasseDerUebergeordnetenKandidatur);
  }
}
