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

import java.util.Collection;

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

import de.ivu.elect.business.gruppe.boundary.EinzelbewerberBoundaryCreate;
import de.ivu.elect.business.gruppe.control.PolitischeGruppeCreate;
import de.ivu.elect.business.gruppeimgebiet.control.GruppeImGebietCache;
import de.ivu.elect.business.kandidatur.control.DirektkandidaturCreate;
import de.ivu.elect.business.kandidatur.control.ListenkandidaturCreate;
import de.ivu.elect.business.kandidatur.entity.Direktkandidatur;
import de.ivu.elect.business.kandidatur.entity.Listenkandidatur;
import de.ivu.elect.business.wahlvorschlag.control.DirektkandidatCreate;
import de.ivu.elect.business.wahlvorschlag.control.ListeCreate;
import de.ivu.elect.business.wahlvorschlag.control.WahlvorschlagsdokumentCreate;
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.Wahlvorschlagsdokument;

/**
 * Klasse nicht als Vorlage für weitere Create Klassen nutzen!
 */
@Stateless
public class EinzelbewerberWahlvoschlagBoundaryCreate {

  @Inject
  protected transient EinzelbewerberBoundaryCreate einzelbewerberBoundaryCreate;

  @Inject
  protected transient PolitischeGruppeCreate politischeGruppeCreate;

  @Inject
  protected transient WahlvorschlagsdokumentCreate wahlvorschlagsdokumentCreate;

  @Inject
  protected transient ListeCreate listeCreate;

  @Inject
  protected transient ListenkandidaturCreate listenkandidaturCreate;

  @Inject
  protected transient DirektkandidatCreate direktkandidatCreate;

  @Inject
  protected transient DirektkandidaturCreate direktkandidaturCreate;

  public EinzelbewerberWahlvoschlagBoundaryCreate() {
    super();
  }

  public void saveAndCreateEinzelkandidaturAndWahlvorschlagsdokumente(Liste einzelliste, Listenkandidatur einzelkandidatur, Collection<Wahlvorschlagsdokument> wahlvorschlagsdokumente) {
    saveAndCreateEinzelkandidatur(einzelliste, einzelkandidatur);

    wahlvorschlagsdokumentCreate.save(wahlvorschlagsdokumente);
  }

  public void saveAndCreateEinzelkandidatur(Liste einzelliste, Listenkandidatur einzelkandidatur) {
    verifyCompleteEinzelbewerber(einzelliste);

    einzelkandidatur.setEingereichtePosition(1L);
    einzelkandidatur.setVorgegebenePosition(1L);
    einzelkandidatur.setRelativePosition(1L);

    einzelliste.removeAllListenkandidaturen();
    einzelliste.addListenkandidatur(einzelkandidatur);

    politischeGruppeCreate.save(einzelliste.getGruppe());

    listeCreate.save(einzelliste);

    listenkandidaturCreate.save(einzelkandidatur);
  }

  public void saveAndCreateEinzelkandidaturAndWahlvorschlagsdokumente(Direktkandidat einzelkandidat, Direktkandidatur einzelkandidatur, Collection<Wahlvorschlagsdokument> wahlvorschlagsdokumente) {
    saveAndCreateEinzelkandidatur(einzelkandidat, einzelkandidatur);

    wahlvorschlagsdokumentCreate.save(wahlvorschlagsdokumente);
  }

  public void saveAndCreateEinzelkandidatur(Direktkandidat einzelkandidat, Direktkandidatur einzelkandidatur) {
    verifyCompleteEinzelbewerber(einzelkandidat);

    politischeGruppeCreate.save(einzelkandidat.getGruppe());

    direktkandidatCreate.save(einzelkandidat);

    direktkandidaturCreate.save(einzelkandidatur);
  }

  public void save(Direktkandidat einzelkandidat, GruppeImGebietCache gruppeImGebietCache) {
    verifyCompleteEinzelbewerber(einzelkandidat);

    // ELECT-3396
    //    politischeGruppeCreate.save(einzelkandidat.getGruppe());
    gruppeImGebietCache.addGruppeToCached(einzelkandidat.getGruppe());

    direktkandidatCreate.save(einzelkandidat.getGruppeImGebiet(), einzelkandidat, gruppeImGebietCache);
  }

  private void verifyCompleteEinzelbewerber(Wahlvorschlag einzelbewerber) {
    einzelbewerberBoundaryCreate.verifyCompleteEinzelbewerber(einzelbewerber);
  }
}
