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

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

import de.ivu.elect.business.gebietsbaum.entity.Wahldurchfuehrungsgebiet;
import de.ivu.elect.business.wahlbeteiligung.entity.QWahlbeteiligung;
import de.ivu.elect.business.wahlbeteiligung.entity.Wahlbeteiligung;
import de.ivu.elect.jee.entity.QueryDsl;


import static java.util.stream.Collectors.toList;

public class WahlbeteiligungSearch extends AbstractWahlbeteiligungSearch {

  @Override
  protected List<Wahlbeteiligung> querySearchResult(WahlbeteiligungSearchParameters searchParameters) {

    if (searchParameters.getWahlbeteiligungAuswertung() == null && searchParameters.getWahl() == null) {
      return Collections.emptyList();
    }

    if (searchParameters.getGebiet() == null && !searchParameters.isUntergeordneteGebieteAnzeigen()) {
      return Collections.emptyList();
    }

    QueryDsl qdsl = dao.getQueryDsl();

    QWahlbeteiligung wahlbeteiligung = QWahlbeteiligung.wahlbeteiligung;
    qdsl.from(wahlbeteiligung);

    qdsl.eq(wahlbeteiligung.wahlbeteiligungAuswertung.wahl, searchParameters.getWahl());
    qdsl.eqIfNotNull(wahlbeteiligung.wahlbeteiligungAuswertung.datum, searchParameters.getWahlbeteiligungAuswertung().getDatum());
    if (!searchParameters.isUntergeordneteGebieteAnzeigen()) {
      qdsl.eqIfNotNull(wahlbeteiligung.wahldurchfuehrungsgebiet, searchParameters.getGebiet().castTo(Wahldurchfuehrungsgebiet.class).getEntity());
    }

    qdsl.orderBy(wahlbeteiligung.wahldurchfuehrungsgebiet.position.asc(), wahlbeteiligung.wahlbeteiligungAuswertung.datum.asc());

    List<Wahlbeteiligung> result = qdsl.list(wahlbeteiligung);
    if (searchParameters.getGebiet() == null) {
      return result;
    }

    return result.stream().filter(vg -> vg.getGebiet().isInGebietshierarchieUntergeordnetesGebietVon(searchParameters.getGebiet())).collect(toList());

  }
}
