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

import static java.util.Collections.sort;

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

import de.ivu.elect.business.fremdkandidatur.control.FremdkandidaturDefaultComparator;
import de.ivu.elect.business.fremdkandidatur.entity.Fremdkandidatur;
import de.ivu.elect.business.fremdkandidatur.entity.QFremdkandidatur;
import de.ivu.elect.jee.entity.QueryDsl;

public class FremdkandidaturSearch extends AbstractFremdkandidaturSearch {

  private static final Comparator<Fremdkandidatur> DEFAULT_COMPARATOR = new FremdkandidaturDefaultComparator();

  public FremdkandidaturSearch() {
    super();
  }

  @Override
  protected List<Fremdkandidatur> querySearchResult(FremdkandidaturSearchParameters searchParameters) {
    List<Fremdkandidatur> result = new ArrayList<>();

    QFremdkandidatur fremdkandidatur = QFremdkandidatur.fremdkandidatur;

    QueryDsl queryDsl = dao.getQueryDsl();
    queryDsl.from(fremdkandidatur);

    queryDsl.eq(fremdkandidatur.wahl, searchParameters.getSelectedWahl());

    queryDsl.eqIfNotNull(fremdkandidatur.personStatus, searchParameters.getPersonStatus());
    queryDsl.likeNormalizedIfNotBlank(fremdkandidatur.familiennameNormalisiert, searchParameters.getFamilienname());
    queryDsl.likeInAnyNormalizedIfNotBlank(fremdkandidatur.rufnameNormalisiert, fremdkandidatur.vornamenNormalisiert, searchParameters.getVornameSeparator(), searchParameters.getVorname());

    result.addAll(searchParameters.applyLimit(queryDsl).list(fremdkandidatur));

    sort(result, getFremdkandidaturComparator());

    return result;
  }

  protected Comparator<Fremdkandidatur> getFremdkandidaturComparator() {
    return DEFAULT_COMPARATOR;
  }
}
