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

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

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

import de.ivu.elect.business.gruppe.entity.GruppeArt;
import de.ivu.elect.business.gruppe.entity.PolitischeGruppe;
import de.ivu.elect.business.kandidatur.entity.Kandidatur;
import de.ivu.elect.business.wahl.entity.Wahl;
import de.ivu.elect.business.wahlvorschlag.entity.Direktkandidat;
import de.ivu.elect.business.wahlvorschlag.entity.Liste;
import de.ivu.elect.business.wahlvorschlag.entity.Wahlvorschlag;

@Stateless
public class EinzelbewerberBoundaryCreate {

  public static final String DEFAULT_EINZELKANDIDAT_GRUPPE_KURZNAME_FORMAT = "EB:%s";

  @Inject
  private transient PolitischeGruppeFactory politischeGruppeFactory;

  public EinzelbewerberBoundaryCreate() {
    super();
  }

  public void verifyCompleteEinzelbewerber(Wahlvorschlag einzelbewerber) {
    PolitischeGruppe politischeGruppe = einzelbewerber.getGruppe();

    if (politischeGruppe != null && !politischeGruppe.hasKurzname()) { // NOTE, dass der Kurzname für Einzelbewerber ggf. automatisch generiert wird.
      politischeGruppe.setKurzname(generateKurzname(einzelbewerber));
    }
  }

  public PolitischeGruppe createGruppe(Wahl wahl) {
    PolitischeGruppe politischeGruppe = createGruppe();
    politischeGruppe.setGruppeArt(GruppeArt.EINZELBEWERBER);
    politischeGruppe.setWahl(wahl);
    politischeGruppe.setSchluessel(generateSchluessel(wahl));
    politischeGruppe.setMinderheit(Boolean.FALSE);

    return politischeGruppe;
  }

  protected PolitischeGruppe createGruppe() {
    return politischeGruppeFactory.create();
  }

  public String generateSchluessel(Wahl wahl) {
    return "";
  }

  public String generateKurzname(Wahlvorschlag einzelbewerber) {
    if (einzelbewerber == null || !einzelbewerber.isEinzelbewerber()) {
      throw new IllegalArgumentException("Generierung des Kurznamens fuer eine Gruppe setzt einen gueltigen Einzelbewerber [einzelbewerber = <" + einzelbewerber + ">] voraus");
    }

    Kandidatur einzelkandidatur = null;

    if (einzelbewerber.isDirektkandidat()) {
      einzelkandidatur = castTo(einzelbewerber, Direktkandidat.class).getDirektkandidatur();
    }

    if (einzelbewerber.isListe()) {
      einzelkandidatur = castTo(einzelbewerber, Liste.class).getListenkandidaturen().stream().findFirst().orElse(null);
    }

    if (einzelkandidatur == null) {
      throw new IllegalArgumentException("Generierung des Kurznamens fuer die Gruppe des uebergebenen Einzelbewerbers [einzelbewerber = <" + einzelbewerber
          + ">] setzt eine gueltige Kandidatur [einzelkandidatur = <" + einzelkandidatur + ">] voraus");
    }

    return generateKurzname(einzelkandidatur);
  }

  private String generateKurzname(Kandidatur einzelkandidatur) {
    return String.format(DEFAULT_EINZELKANDIDAT_GRUPPE_KURZNAME_FORMAT, einzelkandidatur.getFamilienname());
  }
}
