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

import static org.apache.commons.lang3.StringUtils.isBlank;

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

import javax.ejb.Stateless;

import de.ivu.elect.business.ergebnis.entity.Ergebnis;
import de.ivu.elect.business.ergebnis.entity.Ergebnisart;
import de.ivu.elect.business.wahl.entity.Wahl;

@Stateless
public class ErgebnisSearch extends AbstractErgebnisSearch {

  public ErgebnisSearch() {
    super();
  }

  @Override
  protected List<Ergebnis> querySearchResult(ErgebnisSearchParameters searchParameters) {
    return getSearchResultByErgebnisartAndWahl(searchParameters.getWahlergebnisart(), searchParameters.getWahl());
  }

  public List<Ergebnis> getSearchResultAutoCompleteByName(String name, Ergebnisart ergebnisart, Wahl wahl) {
    if (isBlank(name)) {
      return getSearchResultByErgebnisartAndWahl(ergebnisart, wahl);
    }

    return dao.findByNameAndErgebnisartAndWahlAutoComplete(convertSearchPattern(name), ergebnisart, wahl);
  }

  public List<Ergebnis> getByWahlAndErgenisarten(Wahl wahl, Ergebnisart... ergebnisarten) {
    List<Ergebnis> result = new ArrayList<>();

    for (Ergebnisart ergebnisart : ergebnisarten) {
      result.addAll(getSearchResultByErgebnisartAndWahl(ergebnisart, wahl));
    }

    return result;
  }

  private List<Ergebnis> getSearchResultByErgebnisartAndWahl(Ergebnisart ergebnisart, Wahl wahl) {
    if (wahl == null) {
      return Collections.emptyList();
    }

    if (ergebnisart == null) {
      return getSearchResultByWahl(wahl);
    }

    return dao.findByWahlAndErgebnisart(wahl, ergebnisart);
  }

  private List<Ergebnis> getSearchResultByWahl(Wahl wahl) {
    return dao.findByWahl(wahl);
  }
}
