
package de.ivu.elect.jee.presentation.dynamicform;

import static java.util.Collections.emptyList;
import static java.util.Objects.nonNull;

import java.util.ArrayList;
import java.util.List;

public abstract class AbstractSelectManyAutoCompleteProperty<T> extends AbstractAutoCompleteProperty<T, List<T>> {

  public AbstractSelectManyAutoCompleteProperty(AbstractAutoCompleteOptionsProvider<T> optionsProvider) {
    super(optionsProvider);
  }

  @Override
  protected boolean mustBeAccessableOnPageLoadByValue() {
    if (super.mustBeAccessableOnPageLoadByValue()) {
      return true;
    }

    return notAllEqual(getDefaultValue(), getValue());
  }

  @Override
  protected boolean hasDefaultValue() {
    return notNullOrEmpty(getDefaultValue());
  }

  @Override
  public List<T> getDefaultValue() {
    return emptyList();
  }

  @Override
  public boolean hasValue() {
    return notNullOrEmpty(getValue());
  }

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

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

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

  @Override
  public int getMaxQueryLength() {
    // NOTE, dass sich dieser Wert auf die maximale Anzahl an Zeichen in dem Eingabefeld bezieht und dass dieser Wert
    // bei mehreren möglichen Werten standardmäßig keine Rolle spielt.
    return UNLIMITED;
  }

  @Override
  public int getMaxOptionsSelectedCount() {
    return UNLIMITED;
  }

  @Override
  public void setValue(List<T> selection) {
    List<T> values = new ArrayList<>();

    if (nonNull(selection)) {
      values.addAll(selection);
    }

    super.setValue(values);
  }

  @Override
  protected List<T> handleNonNullOptionByRecentQuery(List<T> optionsSelected, T optionByRecentQuery) {
    List<T> values = new ArrayList<>(optionsSelected);

    if (!values.contains(optionByRecentQuery)) {
      values.add(optionByRecentQuery);
    }

    return values;
  }
}
