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

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

import de.ivu.elect.business.ergebnis.control.DHondtQuotientListenInGruppeByRangInGruppeComparator;
import de.ivu.elect.business.ergebnis.entity.DHondtQuotientListenInGruppe;
import de.ivu.elect.business.ergebnis.entity.Ergebnis;
import de.ivu.elect.business.ergebnis.entity.QDHondtQuotientListenInGruppe;
import de.ivu.elect.business.gebietsbaum.entity.Gebiet;
import de.ivu.elect.jee.entity.QueryDsl;

public class DHondtQuotientListenInGruppeSearch extends AbstractDHondtQuotientListenInGruppeSearch {

  private static final QDHondtQuotientListenInGruppe D_HONDT_QUOTIENT = QDHondtQuotientListenInGruppe.dHondtQuotientListenInGruppe;

  public DHondtQuotientListenInGruppeSearch() {
    super();
  }

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

    if (searchParameters.hasErgebnis()) {
      QueryDsl queryDsl = createQueryDsl(searchParameters.getErgebnis());

      if (searchParameters.hasGruppe()) {
        queryDsl.eq(D_HONDT_QUOTIENT.politischeGruppe, searchParameters.getGruppe());
      }

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

      if (searchParameters.hasGebiet()) {
        Gebiet gebiet = searchParameters.getGebiet();

        if (gebiet.hasUebergeordnetesGebiet()) {
          result.removeIf(dHondtQuotient -> !gebiet.equals(dHondtQuotient.getListe().getGebiet()));
        }
      }

      // Rang der Liste in der Gruppe -> Sitze 1 bis n als erste Einträge, das Gebiet der Liste ist dabei irrelevant...
      Collections.sort(result, DHondtQuotientListenInGruppeByRangInGruppeComparator.ASCENDING);
    }

    return result;
  }

  private QueryDsl createQueryDsl(Ergebnis ergebnis) {
    QueryDsl queryDsl = dao.getQueryDsl();
    queryDsl.getQuery().from(D_HONDT_QUOTIENT);
    queryDsl.eq(D_HONDT_QUOTIENT.ergebnis, ergebnis);

    return queryDsl;
  }
}
