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

import static java.util.Objects.isNull;

import java.util.List;

import javax.annotation.Nullable;
import javax.enterprise.event.Observes;
import javax.enterprise.event.Reception;

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

import de.ivu.elect.business.person.boundary.SearchParametersMitPersonendatenNamen;
import de.ivu.elect.business.person.entity.EntityMitPersonendatenArt;
import de.ivu.elect.business.person.entity.Personendaten;
import de.ivu.elect.business.person.entity.PersonendatenArt;
import de.ivu.elect.business.person.entity.PersonendatenProperties;
import de.ivu.elect.business.veranstaltung.entity.Teilnahme;
import de.ivu.elect.business.veranstaltung.entity.TeilnahmeProperties;
import de.ivu.elect.business.veranstaltung.entity.TeilnehmerRolle;
import de.ivu.elect.business.veranstaltung.entity.TeilnehmerStatus;
import de.ivu.elect.business.veranstaltung.entity.Veranstaltung;
import de.ivu.elect.jee.entity.customdata.EmptyCustomData;
import de.ivu.elect.jee.presentation.dynamicform.Property;
import de.ivu.elect.presentation.person.form.PersonendatenDiscriminatorProperty;

@GroupedConversationScoped
@ConversationGroup(AbstractTeilnahmeSearchParameters.class)
public class TeilnahmeSearchParameters extends AbstractTeilnahmeSearchParameters implements SearchParametersMitPersonendatenNamen, EntityMitPersonendatenArt {

  private static final long serialVersionUID = 1L;

  private Teilnahme teilnahme;

  private Veranstaltung veranstaltung;

  private PersonendatenArt personendatenArt;

  public TeilnahmeSearchParameters() {
    super();
  }

  private Teilnahme getTeilnahme() {
    if (isNull(teilnahme)) {
      teilnahme = new Teilnahme();
      teilnahme.setPersonendaten(new Personendaten(EmptyCustomData.INSTANCE));
      teilnahme.setTeilnehmerRolle(null);
      teilnahme.setTeilnehmerStatus(null);
    }

    return teilnahme;
  }

  public void setVorgegebenePersonendaten(Personendaten vorgegebenePerson) {
    Personendaten personendaten = getTeilnahmePersonendaten();

    personendaten.setId(vorgegebenePerson.getId());
    personendaten.setRufname(vorgegebenePerson.getRufname());
    personendaten.setFamilienname(vorgegebenePerson.getFamilienname());
  }

  private TeilnahmeProperties getTeilnahmeProperties() {
    return getTeilnahme().getProperties();
  }

  private Personendaten getTeilnahmePersonendaten() {
    return getTeilnahme().getPersonendaten();
  }

  private PersonendatenProperties getTeilnahmePersonendatenProperties() {
    return getTeilnahmePersonendaten().getProperties();
  }

  public Veranstaltung getVeranstaltung() {
    return veranstaltung;
  }

  public void setVeranstaltung(Veranstaltung veranstaltung) {
    this.veranstaltung = veranstaltung;
  }

  public TeilnehmerRolle getTeilnehmerRolle() {
    return getTeilnahme().getTeilnehmerRolle();
  }

  public Property getTeilnehmerRolleProperty() {
    Property property = getTeilnahmeProperties().getTeilnehmerRolleMitLeererAuswahlProperty();
    property.setRequired(false);

    return property;
  }

  public TeilnehmerStatus getTeilnehmerStatus() {
    return getTeilnahme().getTeilnehmerStatus();
  }

  public Property getTeilnehmerStatusProperty() {
    Property property = getTeilnahmeProperties().getTeilnehmerStatusMitLeererAuswahlProperty();
    property.setRequired(false);

    return property;
  }

  @Override
  public PersonendatenArt getPersonendatenArt() {
    return personendatenArt;
  }

  @Override
  public void setPersonendatenArt(PersonendatenArt personendatenArt) {
    this.personendatenArt = personendatenArt;
  }

  public Property getTeilnehmerPersonendatenDiscriminatorProperty(List<PersonendatenArt> personendatenArten) {
    return new PersonendatenDiscriminatorProperty(this, personendatenArten);
  }

  @Nullable
  public String getTeilnehmerVorname() {
    return getVorname();
  }

  public Property getTeilnehmerVornameProperty() {
    return getVornameProperty();
  }

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

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

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

    return property;
  }

  @Nullable
  public String getTeilnehmerFamilienname() {
    return getFamilienname();
  }

  public Property getTeilnehmerFamiliennameProperty() {
    return getFamiliennameProperty();
  }

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

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

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

    return property;
  }

  public void onVeranstaltungSelectChangeEvent(@Observes(notifyObserver = Reception.IF_EXISTS) VeranstaltungSelectChangeEvent event) {
    reset();
  }

  @Override
  public void reset() {
    teilnahme = null;
    veranstaltung = null;

    super.reset();
  }

  public Personendaten getPersonendaten() {
    return getTeilnahme().getPersonendaten();
  }
}
