
package de.ivu.elect.presentation.anschrift.form;

import static java.util.Objects.nonNull;

import javax.annotation.Nonnull;

import de.ivu.elect.business.anschrift.entity.AbstractAnschrift;
import de.ivu.elect.business.anschrift.entity.Anschrift;
import de.ivu.elect.business.anschrift.entity.AnschriftConstants;
import de.ivu.elect.jee.presentation.dynamicform.AbstractSelectOneAutoCompleteProperty;

public class AnschriftPlzAutoCompleteProperty extends AbstractSelectOneAutoCompleteProperty<AnschriftPlzAutoCompleteOption> {

  private final Anschrift anschrift;

  private AnschriftPlzAutoCompleteOption value;

  public AnschriftPlzAutoCompleteProperty(Anschrift anschrift, AnschriftPlzAutoCompleteOptionsProvider optionsProvider) {
    super(optionsProvider);

    this.anschrift = anschrift;
    this.value = new AnschriftPlzAutoCompleteOption(anschrift);
  }

  @Override
  public boolean getDefaultRequired() {
    return !AnschriftConstants.PLZ_NULLABLE;
  }

  @Override
  protected String getDefaultLabelMsgKey() {
    return AnschriftConstants.MESSAGE_KEY_PLZ_EINZAHL;
  }

  @Override
  public int getMinQueryLength() {
    return AbstractAnschrift.PLZ_DEFAULT_LENGTH - 1;
  }

  @Override
  public int getMaxQueryLength() {
    return AnschriftConstants.PLZ_MAX_LENGTH;
  }

  @Override
  protected AnschriftPlzAutoCompleteOption getValueInternal() {
    return value;
  }

  @Override
  protected void setValueInternal(AnschriftPlzAutoCompleteOption value) {
    String anschriftPlz = "";

    if (nonNull(value)) {
      anschriftPlz = value.getPlz();
    }

    this.anschrift.setPlz(anschriftPlz);
    this.value = value;
  }

  @Override
  protected String formatValueLabel(@Nonnull AnschriftPlzAutoCompleteOption value) {
    return value.getPlz();
  }

  @Override
  protected String formatOptionLabel(@Nonnull AnschriftPlzAutoCompleteOption option) {
    String result = option.getPlz();

    if (option.hasOrtsname()) {
      result += " " + option.getOrtsname();
    }

    if (option.hasOrtsteilname()) {
      result += " " + option.getOrtsteilname();
    }

    return result;
  }

  @Override
  protected boolean isNullOrBlank(Object one) {
    return super.isNullOrBlank(one) || one instanceof AnschriftPlzAutoCompleteOption && ((AnschriftPlzAutoCompleteOption) one).isBlank();
  }
}
