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

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

import de.ivu.elect.business.wahlbeteiligung.entity.QWahlbeteiligungVerlaufGebiet;
import de.ivu.elect.business.wahlbeteiligung.entity.WahlbeteiligungVerlaufGebiet;
import de.ivu.elect.jee.entity.QueryDsl;


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

public class WahlbeteiligungVerlaufGebietSearch extends AbstractWahlbeteiligungVerlaufGebietSearch {
  @Override
  protected List<WahlbeteiligungVerlaufGebiet> querySearchResult(WahlbeteiligungVerlaufGebietSearchParameters searchParameters) {

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

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

    QueryDsl qdsl = dao.getQueryDsl();

    QWahlbeteiligungVerlaufGebiet wahlbeteiligungVerlaufGebiet = QWahlbeteiligungVerlaufGebiet.wahlbeteiligungVerlaufGebiet;
    qdsl.from(wahlbeteiligungVerlaufGebiet);

    qdsl.eq(wahlbeteiligungVerlaufGebiet.wahlbeteiligungVerlauf.wahl, searchParameters.getWahl());
    qdsl.eqIfNotBlank(wahlbeteiligungVerlaufGebiet.wahlbeteiligungVerlauf.name, searchParameters.getWahlbeteiligungVerlauf().getName());
    qdsl.eqIfNotNull(wahlbeteiligungVerlaufGebiet.wahlbeteiligungVerlauf.datum, searchParameters.getWahlbeteiligungVerlauf().getDatum());
    if (!searchParameters.isUntergeordneteGebieteAnzeigen()) {
      qdsl.eqIfNotNull(wahlbeteiligungVerlaufGebiet.gebiet, searchParameters.getGebiet());
    }

    qdsl.orderBy(wahlbeteiligungVerlaufGebiet.gebiet.position.asc(), wahlbeteiligungVerlaufGebiet.wahlbeteiligungVerlauf.datum.asc(), wahlbeteiligungVerlaufGebiet.wahlbeteiligungVerlauf.name.asc());

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

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

  }
}
