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

import static java.util.Objects.isNull;
import static java.util.Objects.nonNull;

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.entschaedigung.entity.Auszahlung;
import de.ivu.elect.business.entschaedigung.entity.Entschaedigung;
import de.ivu.elect.business.person.boundary.SearchParametersMitPersonendatenNamen;
import de.ivu.elect.business.person.entity.Personendaten;
import de.ivu.elect.business.person.entity.PersonendatenProperties;
import de.ivu.elect.jee.entity.customdata.EmptyCustomData;
import de.ivu.elect.jee.presentation.dynamicform.Property;

@GroupedConversationScoped
@ConversationGroup(AbstractEntschaedigungSearchParameters.class)
public class EntschaedigungSearchParameters extends AbstractEntschaedigungSearchParameters implements SearchParametersMitPersonendatenNamen {

  private static final long serialVersionUID = 1L;

  private Entschaedigung entschaedigung;

  public EntschaedigungSearchParameters() {
    super();
  }

  private Entschaedigung getEntschaedigung() {
    if (isNull(entschaedigung)) {
      entschaedigung = new Entschaedigung();
      entschaedigung.setPersonendaten(new Personendaten(EmptyCustomData.INSTANCE));
    }

    return entschaedigung;
  }

  public boolean hasAuszahlung() {
    return nonNull(getAuszahlung());
  }

  public Auszahlung getAuszahlung() {
    return getEntschaedigung().getAuszahlung();
  }

  public void setAuszahlung(Auszahlung auszahlung) {
    getEntschaedigung().setAuszahlung(auszahlung);
  }

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

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

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

    return property;
  }

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

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

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

    return property;
  }

  private PersonendatenProperties getPersonendatenProperties() {
    return getPersonendaten().getProperties();
  }

  private Personendaten getPersonendaten() {
    return getEntschaedigung().getPersonendaten();
  }

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

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

    super.reset();
  }
}
