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

import java.util.List;

import javax.inject.Inject;

import de.ivu.elect.business.gebietsbaum.boundary.GebietExtendedDAO;
import de.ivu.elect.business.gebietsbaum.entity.Gebiet;
import de.ivu.elect.business.kandidatur.entity.Direktkandidatur;
import de.ivu.elect.business.kandidatur.entity.QDirektkandidatur;
import de.ivu.elect.business.wahlvorschlag.boundary.WahlvorschlagSearchResultSorter;
import de.ivu.elect.jee.entity.QueryDsl;

public class DirektkandidaturSearch extends AbstractDirektkandidaturSearch {

  @Inject
  private transient GebietExtendedDAO gebietDao;

  @Inject
  private transient WahlvorschlagSearchResultSorter wahlvorschlagSearchResultSorter;

  public DirektkandidaturSearch() {
    super();
  }

  @Override
  protected List<Direktkandidatur> querySearchResult(DirektkandidaturSearchParameters searchParameters) {
    QDirektkandidatur direktkandidatur = QDirektkandidatur.direktkandidatur;

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

    Gebiet gebiet = gebietDao.attach(searchParameters.getGebiet());

    queryDsl.eq(direktkandidatur.direktkandidat.gruppeImGebiet.gebiet, gebiet);

    queryDsl.likeIfNotBlank(direktkandidatur.direktkandidat.kennwort, searchParameters.getKennwort());
    queryDsl.likeIfNotBlank(direktkandidatur.direktkandidat.kurzname, searchParameters.getKurzname());

    queryDsl.likeNormalizedIfNotBlank(direktkandidatur.familiennameNormalisiert, searchParameters.getFamilienname());
    queryDsl.likeInAnyNormalizedIfNotBlank(direktkandidatur.rufnameNormalisiert, direktkandidatur.vornamenNormalisiert, searchParameters.getVornameSeparator(), searchParameters.getVorname());
    queryDsl.likeIfNotBlank(direktkandidatur.titel, searchParameters.getTitel());

    queryDsl.eqIfNotNull(direktkandidatur.kandidaturStatus, searchParameters.getKandidaturStatus());

    List<Direktkandidatur> result = queryDsl.list(direktkandidatur);

    wahlvorschlagSearchResultSorter.sortByWahlvorschlag(gebiet, result);

    return result;
  }
}
