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


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

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

  @Inject
  protected transient PolitischeGruppeCreate politischeGruppeCreate;

  @Inject
  private transient WahlvorschlagsdokumentCreate wahlvorschlagsdokumentCreate;

  @Inject
  protected transient DirektkandidatCreate direktkandidatCreate;

  @Inject
  protected transient DirektkandidaturCreate direktkandidaturCreate;

  @Inject
  protected transient EinzelkandidatGruppeKurznameGenerator einzelbewerberKurznameGenerator;

  public EinzelkandidatCreate() {
    super();
  }

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

    direktkandidaturCreate.save(einzelkandidatur);
  }

  public void save(Direktkandidat einzelkandidat) {
    verifyCompleteEinzelbewerber(einzelkandidat);

    politischeGruppeCreate.save(einzelkandidat.getGruppe());
    direktkandidatCreate.save(einzelkandidat);
  }

  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(Direktkandidat einzelkandidat) {
    PolitischeGruppe einzelbewerber = castTo(einzelkandidat.getGruppe(), PolitischeGruppe.class);

    if (!einzelbewerber.hasKurzname()) {
      // NOTE, dass der Kurzname für Einzelbewerber ggf. automatisch generiert wird.
      einzelbewerber.setKurzname(generateEinzelbewerberKurzname(einzelkandidat));
    }
  }

  protected String generateEinzelbewerberKurzname(Direktkandidat einzelkandidat) {
    return einzelbewerberKurznameGenerator.generateKurzname(einzelkandidat);
  }

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

    saveAndCreateEinzelkandidatur(einzelkandidat, einzelkandidatur);

    wahlvorschlagsdokumentCreate.save(wahlvorschlagsdokumente);
  }
}
