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

import static java.util.Objects.isNull;

import javax.inject.Inject;

import org.apache.deltaspike.core.api.scope.ConversationGroup;
import org.apache.deltaspike.core.api.scope.GroupedConversationScoped;

import de.ivu.elect.business.gebietsbaum.entity.Gebiet;
import de.ivu.elect.business.gruppe.boundary.GruppeFactory;
import de.ivu.elect.business.gruppeimgebiet.boundary.GruppeImGebietFactory;
import de.ivu.elect.business.gruppeimgebiet.entity.GruppeImGebiet;
import de.ivu.elect.business.kandidatur.entity.Direktkandidatur;
import de.ivu.elect.business.kandidatur.entity.DirektkandidaturProperties;
import de.ivu.elect.business.kandidatur.entity.KandidaturStatus;
import de.ivu.elect.business.person.boundary.SearchParametersMitPersonendatenNamen;
import de.ivu.elect.business.wahlvorschlag.boundary.DirektkandidatFactory;
import de.ivu.elect.business.wahlvorschlag.entity.Direktkandidat;
import de.ivu.elect.business.wahlvorschlag.entity.DirektkandidatProperties;
import de.ivu.elect.jee.presentation.dynamicform.Property;

@GroupedConversationScoped
@ConversationGroup(AbstractDirektkandidaturSearchParameters.class)
public class DirektkandidaturSearchParameters extends AbstractDirektkandidaturSearchParameters implements SearchParametersMitPersonendatenNamen {

  private static final long serialVersionUID = 1L;

  private Gebiet gebiet;

  @Inject
  protected GruppeFactory gruppeFactory;

  @Inject
  protected GruppeImGebietFactory gruppeImGebietFactory;

  @Inject
  protected DirektkandidatFactory direktkandidatFactory;

  @Inject
  protected DirektkandidaturFactory direktkandidaturFactory;

  private Direktkandidatur direktkandidatur;

  public DirektkandidaturSearchParameters() {
    super();
  }

  public String getKennwort() {
    return getDirektkandidat().getKennwort();
  }

  public void setKennwort(String kennwort) {
    getDirektkandidat().setKennwort(kennwort);
  }

  public Property getKennwortProperty() {
    Property property = getDirektkandidatProperties().getKennwortProperty();
    property.setRequired(false);

    return property;
  }

  public String getKurzname() {
    return getDirektkandidat().getKurzname();
  }

  public void setKurzname(String kurzname) {
    getDirektkandidat().setKurzname(kurzname);
  }

  public Property getKurznameProperty() {
    Property property = getDirektkandidatProperties().getKurznameProperty();
    property.setRequired(false);

    return property;
  }

  public String getTitel() {
    return getDirektkandidatur().getTitel();
  }

  public void setTitel(String titel) {
    getDirektkandidatur().setTitel(titel);
  }

  public Property getTitelProperty() {
    Property property = getDirektkandidaturProperties().getTitelProperty();
    property.setRequired(false);

    return property;
  }

  @Override
  public String getFamilienname() {
    return getDirektkandidatur().getFamilienname();
  }

  @Override
  public void setFamilienname(String familienname) {
    getDirektkandidatur().setFamilienname(familienname);
  }

  @Override
  public Property getFamiliennameProperty() {
    Property property = getDirektkandidaturProperties().getFamiliennameProperty();
    property.setRequired(false);

    return property;
  }

  @Override
  public String getVorname() {
    return getDirektkandidatur().getRufname();
  }

  @Override
  public void setVorname(String vorname) {
    getDirektkandidatur().setRufname(vorname);
  }

  @Override
  public Property getVornameProperty() {
    Property property = getDirektkandidaturProperties().getRufnameProperty();
    property.setRequired(false);
    property.setLabel(getMessage(SearchParametersMitPersonendatenNamen.MESSAGE_KEY_VORNAME_EINZAHL));

    return property;
  }

  public KandidaturStatus getKandidaturStatus() {
    return getDirektkandidatur().getKandidaturStatus();
  }

  public void setKandidaturStatus(KandidaturStatus kandidaturStatus) {
    getDirektkandidatur().setKandidaturStatus(kandidaturStatus);
  }

  public Property getKandidaturStatusProperty() {
    Property property = getDirektkandidaturProperties().getKandidaturStatusMitLeererAuswahlProperty();
    property.setRequired(false);

    return property;
  }

  private Direktkandidat getDirektkandidat() {
    return getDirektkandidatur().getDirektkandidat();
  }

  private DirektkandidatProperties getDirektkandidatProperties() {
    return getDirektkandidat().getProperties();
  }

  private Direktkandidatur getDirektkandidatur() {
    if (isNull(direktkandidatur)) {
      // HINT ELECT-3082: Wir brauchen die ganzen Objekte, damit Entity-eigener Code (postSet etc.) korrekt funktioniert
      GruppeImGebiet gruppeImGebiet = gruppeImGebietFactory.create();
      gruppeImGebiet.setGruppe(gruppeFactory.create());

      Direktkandidat direktkandidat = direktkandidatFactory.create();
      direktkandidat.setGruppeImGebiet(gruppeImGebiet);

      direktkandidatur = direktkandidaturFactory.create();
      direktkandidatur.setDirektkandidat(direktkandidat);
      direktkandidatur.setKandidaturStatus(null);
    }

    return direktkandidatur;
  }

  private DirektkandidaturProperties getDirektkandidaturProperties() {
    return getDirektkandidatur().getProperties();
  }

  public Gebiet getGebiet() {
    return gebiet;
  }

  public void setGebiet(Gebiet gebiet) {
    this.gebiet = gebiet;
  }

  @Override
  public void reset() {
    direktkandidatur = null;

    super.reset();
  }
}
