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

import de.ivu.elect.business.person.boundary.SearchParametersMitPersonendatenNamen;
import de.ivu.elect.business.person.entity.PersonendatenConstants;
import de.ivu.elect.business.personenpruefung.entity.PersonenKonfliktArt;
import de.ivu.elect.business.personenpruefung.entity.PersonenKonfliktConstants;
import de.ivu.elect.business.personenpruefung.entity.PersonenKonfliktStatus;
import de.ivu.elect.business.search.control.AbstractElectSearchParameters;
import de.ivu.elect.business.wahl.boundary.WahlSelectChangeEvent;
import de.ivu.elect.business.wahl.boundary.WahlterminSelectChangeEvent;
import de.ivu.elect.jee.presentation.dynamicform.AbstractEnumProperty;
import de.ivu.elect.jee.presentation.dynamicform.AbstractStringProperty;

import javax.enterprise.event.Observes;
import javax.enterprise.event.Reception;
import java.util.ArrayList;
import java.util.List;

public abstract class AbstractPersonenKonfliktSearchParameters extends AbstractElectSearchParameters implements SearchParametersMitPersonendatenNamen {

  private static final long serialVersionUID = 1L;

  private String familienname;

  private String vorname;

  private PersonenKonfliktArt personenKonfliktArt;

  private PersonenKonfliktStatus personenKonfliktStatus;

  public AbstractPersonenKonfliktSearchParameters() {
    super();
  }

  @Override
  public String getFamilienname() {
    return familienname;
  }

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

  @Override
  public FamiliennameProperty getFamiliennameProperty() {
    return new FamiliennameProperty();
  }

  @Override
  public String getVorname() {
    return vorname;
  }

  @Override
  public void setVorname(String vorname) {
    this.vorname = vorname;
  }

  @Override
  public VornameProperty getVornameProperty() {
    return new VornameProperty();
  }

  public boolean hasPersonenKonfliktArt() {
    return getPersonenKonfliktArt() != null;
  }

  public PersonenKonfliktArt getPersonenKonfliktArt() {
    return personenKonfliktArt;
  }

  public void setPersonenKonfliktArt(PersonenKonfliktArt personenKonfliktArt) {
    this.personenKonfliktArt = personenKonfliktArt;
  }

  public PersonenKonfliktArtProperty getKonfliktArtProperty(List<PersonenKonfliktArt> values) {
    return new PersonenKonfliktArtProperty(values);
  }

  public boolean hasPersonenKonfliktStatus() {
    return getPersonenKonfliktStatus() != null;
  }

  public PersonenKonfliktStatus getPersonenKonfliktStatus() {
    return personenKonfliktStatus;
  }

  public void setPersonenKonfliktStatus(PersonenKonfliktStatus personenKonfliktStatus) {
    this.personenKonfliktStatus = personenKonfliktStatus;
  }

  public PersonenKonfliktStatusProperty getPersonenKonfliktStatusProperty() {
    return new PersonenKonfliktStatusProperty();
  }

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

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

  public final class FamiliennameProperty extends AbstractStringProperty {

    @Override
    public boolean getDefaultRequired() {
      return false;
    }

    @Override
    public int getDefaultMaxLength() {
      return PersonendatenConstants.FAMILIENNAME_MAX_LENGTH;
    }

    @Override
    public String getDefaultLabel() {
      return getMessage(PersonendatenConstants.MESSAGE_KEY_FAMILIENNAME_EINZAHL);
    }

    @Override
    public String getValue() {
      return getFamilienname();
    }

    @Override
    public void setValue(String value) {
      setFamilienname(value);
    }

    @Override
    public String getDefaultTooltip() {
      return getMessage(WILDCARD_TOOLTIP_MSG_KEY);
    }
  }

  public final class VornameProperty extends AbstractStringProperty {

    @Override
    public boolean getDefaultRequired() {
      return false;
    }

    @Override
    public int getDefaultMaxLength() {
      return PersonendatenConstants.VORNAME_MAX_LENGTH;
    }

    @Override
    public String getDefaultLabel() {
      return getMessage(SearchParametersMitPersonendatenNamen.MESSAGE_KEY_VORNAME_EINZAHL);
    }

    @Override
    public String getValue() {
      return getVorname();
    }

    @Override
    public void setValue(String value) {
      setVorname(value);
    }

    @Override
    public String getDefaultTooltip() {
      return getMessage(WILDCARD_TOOLTIP_MSG_KEY);
    }
  }

  public final class PersonenKonfliktArtProperty extends AbstractEnumProperty<PersonenKonfliktArt> {

    private final List<PersonenKonfliktArt> values;

    public PersonenKonfliktArtProperty(List<PersonenKonfliktArt> values) {
      this.values = values;
    }

    @Override
    public boolean hasNoSelectionItem() {
      return true;
    }

    @Override
    public boolean getDefaultRequired() {
      return false;
    }

    @Override
    public String getDefaultLabel() {
      return getMessage(PersonenKonfliktConstants.MESSAGE_KEY_PERSONEN_KONFLIKT_ART_EINZAHL);
    }

    @Override
    public PersonenKonfliktArt getValue() {
      return getPersonenKonfliktArt();
    }

    @Override
    public void setValue(PersonenKonfliktArt value) {
      setPersonenKonfliktArt(value);
    }

    @Override
    public List<PersonenKonfliktArt> getValues() {
      return values;
    }

    @Override
    protected Class<PersonenKonfliktArt> getEnumClass() {
      return PersonenKonfliktArt.class;
    }
  }

  public class PersonenKonfliktStatusProperty extends AbstractEnumProperty<PersonenKonfliktStatus> {

    @Override
    public boolean hasNoSelectionItem() {
      return true;
    }

    @Override
    public boolean getDefaultRequired() {
      return false;
    }

    @Override
    public String getDefaultLabel() {
      return getMessage(PersonenKonfliktConstants.MESSAGE_KEY_PERSONEN_KONFLIKT_STATUS_EINZAHL);
    }

    @Override
    public PersonenKonfliktStatus getValue() {
      return getPersonenKonfliktStatus();
    }

    @Override
    public void setValue(PersonenKonfliktStatus value) {
      setPersonenKonfliktStatus(value);
    }

    @Override
    public List<PersonenKonfliktStatus> getValues() {
      return new ArrayList<>(AbstractPersonenKonfliktSearch.PERSONEN_KONFLIKT_STATUS_DEFAULTS);
    }

    @Override
    protected Class<PersonenKonfliktStatus> getEnumClass() {
      return PersonenKonfliktStatus.class;
    }
  }
}
