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

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

import java.util.Collection;
import java.util.Collections;
import java.util.List;
import java.util.function.Function;
import java.util.stream.Stream;

import javax.inject.Inject;

import de.ivu.elect.business.person.entity.Personendaten;
import de.ivu.elect.business.personenpruefung.control.wertelisten.PersonendatenWertelistenAbgleichFinder;
import de.ivu.elect.business.wertelisten.boundary.WertelistenExtendedDAO;
import de.ivu.elect.business.wertelisten.entity.Wertelisten;
import de.ivu.elect.business.wertelisten.entity.WertelistenArt;
import de.ivu.elect.jee.presentation.dynamicform.AbstractAutoCompleteStringOptionsProvider;

public abstract class AbstractPersonendatenWertelistenAutoCompleteOptionsProvider extends AbstractAutoCompleteStringOptionsProvider<Wertelisten> {

  private static final long serialVersionUID = 1L;

  @Inject
  private WertelistenExtendedDAO wertelistenDao;

  @Inject
  private PersonendatenWertelistenAbgleichFinder personendatenWertelistenAbgleichFinder;

  private final WertelistenArt wertelistenArt;

  private Personendaten personendaten;

  public AbstractPersonendatenWertelistenAutoCompleteOptionsProvider(WertelistenArt wertelistenArt) {
    super();

    this.wertelistenArt = wertelistenArt;
  }

  public boolean isInitialized() {
    return nonNull(wertelistenArt) && nonNull(personendaten);
  }

  public void setPersonendaten(Personendaten personendaten) {
    if (isNull(personendaten) || !personendaten.equals(this.personendaten)) {
      resetOptions();
    }

    this.personendaten = personendaten;
  }

  @Override
  protected Collection<Wertelisten> getTemplatesInternal() {
    if (isInitialized()) {
      return personendatenWertelistenAbgleichFinder.getWertelisten(wertelistenDao, personendaten, Collections.singletonList(wertelistenArt));
    }

    throw new IllegalStateException("Suche nach Wertelisten ohne Personendaten oder Art der Wertelisten nicht möglich [personendaten = "
        + personendaten + ", wertelistenArt = " + wertelistenArt + "]");
  }

  @Override
  protected Function<Wertelisten, List<String>> templateToOptions() {
    return wertelisten -> Collections.singletonList(wertelisten.getName());
  }
}
