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

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

import javax.inject.Inject;

import de.ivu.elect.business.gebietsbaum.boundary.GebietExtendedDAO;
import de.ivu.elect.business.gebietsbaum.entity.AbstractGebiet;
import de.ivu.elect.business.gebietsbaum.entity.Gebiet;
import de.ivu.elect.business.stimmzettel.entity.QStimmzettelKopfdatum;
import de.ivu.elect.business.stimmzettel.entity.StimmzettelKopfdatum;
import de.ivu.elect.jee.entity.QueryDsl;


import static de.ivu.elect.business.stimmzettel.boundary.StimmzettelSearch.MAX_GEBIETE_ANZAHL;
import static java.util.stream.Collectors.toList;

public class StimmzettelKopfdatumSearch extends AbstractStimmzettelKopfdatumSearch {

  @Inject
  private transient GebietExtendedDAO gebietExtendedDAO;

  @Override
  protected List<StimmzettelKopfdatum> querySearchResult(StimmzettelKopfdatumSearchParameters searchParameters) {
    if (searchParameters.getGebiet() == null) {
      return Collections.emptyList();
    }

    QStimmzettelKopfdatum qStimmzettelKopfdatum = QStimmzettelKopfdatum.stimmzettelKopfdatum;

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

    queryDsl.eqIfNotBlank(qStimmzettelKopfdatum.schluessel, searchParameters.getStimmzettelKopfdatum().getSchluessel());
    queryDsl.orderBy(qStimmzettelKopfdatum.schluessel.asc());

    Gebiet gebiet = gebietExtendedDAO.attach(searchParameters.getGebiet());
    if (gebiet.isErfassungsgebiet()) {
      queryDsl.eq(qStimmzettelKopfdatum.gebiet, gebiet);
    } else {
      List<Gebiet> gebiete = gebietExtendedDAO.findByWahl(gebiet.getWahl()).stream()
          .filter(AbstractGebiet::isErfassungsgebiet)
          .filter(gebiet::isInGebietshierarchieUebergeordnetesGebietVon).collect(toList());
      if (gebiete.isEmpty() || gebiete.size() > MAX_GEBIETE_ANZAHL) {
        return Collections.emptyList();
      }
      queryDsl.inIfNotEmpty(qStimmzettelKopfdatum.gebiet, gebiete);
    }

    searchParameters.applyLimit(queryDsl);

    return queryDsl.list(qStimmzettelKopfdatum);
  }
}
