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

import java.util.Collections;
import java.util.HashSet;
import java.util.Set;

import javax.annotation.Nonnull;

import de.ivu.elect.business.kandidatur.entity.Direktkandidatur;
import de.ivu.elect.business.kandidatur.entity.Kandidatur;
import de.ivu.elect.business.person.entity.Sperrmerkmal;
import de.ivu.elect.business.security.entity.EntityMitSperrmerkmal;

public abstract class AbstractDirektkandidat extends Wahlvorschlag implements DirektkandidatBase, EntityMitSperrmerkmal {

  private static final long serialVersionUID = 1L;

  public AbstractDirektkandidat() {
    super();
  }

  @Override
  @Nonnull
  public Sperrmerkmal getSperrmerkmal() {
    if (hasDirektkandidatur()) {
      return getDirektkandidatur().getSperrmerkmal();
    }

    return Sperrmerkmal.UNBEKANNT;
  }

  @Override
  public boolean hasSameWahlvorschlagArt(AbstractWahlvorschlag wahlvorschlag) {
    return wahlvorschlag != null && wahlvorschlag.isDirektkandidat();
  }

  public boolean hasDirektkandidatur() {
    return getDirektkandidatur() != null;
  }

  public Direktkandidatur getDirektkandidatur() {
    for (Direktkandidatur direktkandidatur : getDirektkandidatursByDirektkandidat()) {
      return direktkandidatur;
    }

    return null;
  }

  public void setDirektkandidatur(Direktkandidatur direktkandidatur) {
    removeAllDirektkandidaturByDirektkandidats();

    if (direktkandidatur != null) {
      addDirektkandidaturByDirektkandidat(direktkandidatur);
    }
  }

  @Override
  public boolean isListe() {
    return false;
  }

  @Override
  public Liste getListe() {
    throw new IllegalStateException("Ist Direktkandidat!");
  }

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

  @Override
  public Direktkandidat getDirektkandidat() {
    return (Direktkandidat) this;
  }

  @Override
  public boolean isReferendumOption() {
    return false;
  }

  @Override
  public ReferendumOption getReferendumOption() {
    throw new IllegalStateException("Ist Direktkandidat!");
  }

  @Override
  protected void postSetWahlvorschlagStatus(WahlvorschlagStatus alterWert, WahlvorschlagStatus neuerWert) {
    if (neuerWert != null && wertHatSichGeaendert(alterWert, neuerWert) && hasDirektkandidatur()) {
      getDirektkandidatur().setKandidaturStatus(neuerWert.toKandidaturStatus());
    }
  }

  @Override
  public Set<Kandidatur> getKandidaturen() {
    return new HashSet<>(Collections.singleton(getDirektkandidatur()));
  }
}
