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

import static java.util.Objects.nonNull;

import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;
import java.util.Optional;

import de.ivu.elect.business.search.control.BenutzerSuchparameterByNameComparator;
import de.ivu.elect.business.search.entity.AbstractBenutzerSuchparameter;
import de.ivu.elect.business.search.entity.BenutzerSuchparameter;
import de.ivu.elect.business.wahl.entity.Wahl;
import de.ivu.elect.business.wahl.entity.Wahltermin;

public class BenutzerSuchparameterSearch extends AbstractBenutzerSuchparameterSearch {

  private static final Comparator<BenutzerSuchparameter> DEFAULT_COMPARATOR = new BenutzerSuchparameterByNameComparator();

  public BenutzerSuchparameterSearch() {
    super();
  }

  @Override
  protected List<BenutzerSuchparameter> querySearchResult(BenutzerSuchparameterSearchParameters searchParameters) {
    return getSearchResult(searchParameters.getWahltermin(), searchParameters.getWahl(), searchParameters.getBenutzerkennung(), searchParameters.getViewId());
  }

  public List<BenutzerSuchparameter> getSearchResult(Wahltermin wahltermin, Wahl wahl, String benutzerkennung, String viewId) {
    List<BenutzerSuchparameter> result = new ArrayList<>();

    if (nonNull(wahl)) {
      result.addAll(dao.findByWahlterminWahlBenutzerkennungViewId(wahl.getWahltermin(), wahl, benutzerkennung, viewId));
    } else {
      result.addAll(dao.findByWahlterminBenutzerkennungViewId(wahltermin, benutzerkennung, viewId));
    }

    result.sort(DEFAULT_COMPARATOR);

    return result;
  }

  public Optional<BenutzerSuchparameter> findBenutzerSuchparameterAlsDefault(Wahltermin wahltermin, Wahl wahl, String benutzerkennung, String viewId) {
    try {
      return getSearchResult(wahltermin, wahl, benutzerkennung, viewId).stream() //
          .filter(AbstractBenutzerSuchparameter::isSuchparameterAlsDefault) //
          .findFirst() //
          .map(benutzerSuchparameter -> dao.refresh(benutzerSuchparameter)); // Immer aktuell laden!
    } catch (Exception ignored) {
    }

    return Optional.empty();
  }
}
