
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.DHondtQuotientByRangComparator;
import de.ivu.elect.business.ergebnis.entity.DHondtQuotientPolitischeGruppe;
import de.ivu.elect.business.ergebnis.entity.Ergebnis;
import de.ivu.elect.business.ergebnis.entity.QDHondtQuotientPolitischeGruppe;
import de.ivu.elect.jee.entity.QueryDsl;

public class DHondtQuotientPolitischeGruppeSearch extends AbstractDHondtQuotientPolitischeGruppeSearch {

  private static final QDHondtQuotientPolitischeGruppe D_HONDT_QUOTIENT = QDHondtQuotientPolitischeGruppe.dHondtQuotientPolitischeGruppe;

  public DHondtQuotientPolitischeGruppeSearch() {
    super();
  }

  @Override
  protected List<DHondtQuotientPolitischeGruppe> querySearchResult(DHondtQuotientPolitischeGruppeSearchParameters searchParameters) {
    List<DHondtQuotientPolitischeGruppe> 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));

      // Rang der Gruppe -> Sitze 1 bis n als erste Einträge, das Gebiet ist immer das gesamte Wahlgebiet...
      Collections.sort(result, DHondtQuotientByRangComparator.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;
  }
}
