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

import static de.ivu.elect.jee.faces.FacesContextUtil.requireDevelopmentStage;

import java.io.Serializable;

import javax.ejb.Stateless;
import javax.inject.Inject;

import de.ivu.elect.business.kandidatur.boundary.KandidaturZuTestzweckenZulasser;
import de.ivu.elect.business.kandidatur.entity.Listenkandidatur;
import de.ivu.elect.business.wahlvorschlag.entity.Direktkandidat;
import de.ivu.elect.business.wahlvorschlag.entity.Liste;
import de.ivu.elect.business.wahlvorschlag.entity.Wahlvorschlag;
import de.ivu.elect.business.wahlvorschlag.entity.WahlvorschlagStatus;

/**
 * !!!!!! Klasse NICHT für Produktivzwecke gedacht !!!!!!
 */
@Stateless
public class WahlvorschlagZuTestzweckenZulasser implements Serializable {

  private static final long serialVersionUID = 1L;

  @Inject
  private transient ListeDAO listeDAO;

  @Inject
  private transient ListeEdit listeEdit;

  @Inject
  private transient DirektkandidatDAO direktkandidatDAO;

  @Inject
  private transient DirektkandidatEdit direktkandidatEdit;

  @Inject
  private transient KandidaturZuTestzweckenZulasser kandidaturZuTestzweckenZulasser;

  public WahlvorschlagZuTestzweckenZulasser() {
    super();
  }

  public void lasseDirektkandidatZu(Direktkandidat direktkandidat) {
    requireDevelopmentStage();

    Direktkandidat direktkandidatAttached = direktkandidatDAO.attach(direktkandidat);

    if (direktkandidatAttached.isUngeprueft() || direktkandidat.getDirektkandidatur().isUngeprueft()) {
      kandidaturZuTestzweckenZulasser.lasseDirektkandidaturZu(direktkandidat.getDirektkandidatur());

      loeseWahlrechtspruefungenAlsErfuellt(direktkandidatAttached);

      setzeDirektkandidatAufZugelassen(direktkandidatAttached);
    }
  }

  private void setzeDirektkandidatAufZugelassen(Direktkandidat direktkandidatAttached) {
    direktkandidatEdit.setStatus(direktkandidatAttached, WahlvorschlagStatus.ZUGELASSEN, "");
  }

  public void lasseListeMitListenkandidaturenZu(Liste liste) {
    requireDevelopmentStage();

    Liste listeAttached = listeDAO.attach(liste);

    if (listeAttached.isUngeprueft()) {
      for (Listenkandidatur listenkandidatur : listeAttached.getListenkandidaturen()) {
        kandidaturZuTestzweckenZulasser.lasseListenkandidaturZu(listenkandidatur);
      }

      loeseWahlrechtspruefungenAlsErfuellt(listeAttached);

      setzeListeAufZugelassen(listeAttached);
    }
  }

  private void setzeListeAufZugelassen(Liste listeAttached) {
    listeEdit.setStatus(listeAttached, WahlvorschlagStatus.ZUGELASSEN, "");
  }

  protected void loeseWahlrechtspruefungenAlsErfuellt(Wahlvorschlag wahlvorschlag) {
    // in Core (vorerst) nichts zu tun
  }
}
