
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.DHondtQuotientListenImGebietByRangImGebietComparator;
import de.ivu.elect.business.ergebnis.entity.DHondtQuotientListenImGebiet;
import de.ivu.elect.business.ergebnis.entity.Ergebnis;
import de.ivu.elect.business.ergebnis.entity.QDHondtQuotientListenImGebiet;
import de.ivu.elect.business.gebietsbaum.entity.Wahldurchfuehrungsgebiet;
import de.ivu.elect.jee.entity.QueryDsl;

public class DHondtQuotientListenImGebietSearch extends AbstractDHondtQuotientListenImGebietSearch {

  private static final QDHondtQuotientListenImGebiet D_HONDT_QUOTIENT = QDHondtQuotientListenImGebiet.dHondtQuotientListenImGebiet;

  public DHondtQuotientListenImGebietSearch() {
    super();
  }

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

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

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

        if (gebiet.hasUebergeordnetesGebiet()) {
          queryDsl.eq(D_HONDT_QUOTIENT.wahldurchfuehrungsgebiet, gebiet);
        }
      }

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

      if (searchParameters.hasGruppe()) {
        result.removeIf(dHondtQuotient -> !searchParameters.getGruppe().equals(dHondtQuotient.getListe().getGruppe()));
      }

      // Rang der Liste im Gebiet -> Sitze 1 bis n als erste Einträge...
      Collections.sort(result, DHondtQuotientListenImGebietByRangImGebietComparator.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;
  }
}
