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

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

import javax.inject.Inject;

import de.ivu.elect.business.ergebnis.control.AbstractKumulierteStimmenSearch;
import de.ivu.elect.business.ergebnis.control.StimmenPool;
import de.ivu.elect.business.ergebnis.entity.Ergebnis;
import de.ivu.elect.business.gebietsbaum.boundary.GebietExtendedDAO;
import de.ivu.elect.business.gebietsbaum.entity.Gebiet;
import de.ivu.elect.business.gruppe.boundary.PolitischeGruppeExtendedDAO;
import de.ivu.elect.business.gruppe.entity.PolitischeGruppe;
import de.ivu.elect.business.kandidatur.control.KandidaturKumulierteStimmenBuilder;
import de.ivu.elect.business.kandidatur.control.KandidaturKumulierteStimmenByStimmzettelPositionComparator;
import de.ivu.elect.business.kandidatur.entity.KandidaturKumulierteStimmen;
import de.ivu.elect.business.kandidatur.entity.KandidaturStatus;
import de.ivu.elect.business.wahl.entity.Wahl;

public class KandidaturKumulierteStimmenSearch extends AbstractKumulierteStimmenSearch<KandidaturKumulierteStimmenSearchParameters, KandidaturKumulierteStimmen> {

  @Inject
  private transient PolitischeGruppeExtendedDAO politischeGruppeExtendedDAO;

  @Inject
  private transient ListenkandidaturExtendedDAO listenkandidaturExtendedDAO;

  @Inject
  private transient DirektkandidaturExtendedDAO direktkandidaturExtendedDAO;

  @Inject
  private transient KandidaturKumulierteStimmenBuilder kandidaturKumulierteStimmenBuilder;

  @Inject
  private transient GebietExtendedDAO gebietDAO;

  public KandidaturKumulierteStimmenSearch() {
    super();
  }

  @Override
  protected List<KandidaturKumulierteStimmen> suche(Wahl wahl, Gebiet gebietSelected, Ergebnis ergebnisSelected, KandidaturKumulierteStimmenSearchParameters searchParameters) {

    PolitischeGruppe politischeGruppe = politischeGruppeExtendedDAO.attach(searchParameters.getGruppe());

    if (politischeGruppe == null) {
      return Collections.emptyList();
    }

    return kandidaturKumulierteStimmenBuilder.erzeugeKandidaturKumulierteStimmenFuerGruppeAufGebiet(gebietDAO.attach(gebietSelected),
        listenkandidaturExtendedDAO.findByGruppeAndUngleichStatus(politischeGruppe, KandidaturStatus.NICHT_ZUGELASSEN),
        direktkandidaturExtendedDAO.findByGruppeAndUngleichStatus(politischeGruppe, KandidaturStatus.NICHT_ZUGELASSEN), getEntityAufStimmzettelDaten(),
        StimmenPool.createStimmenPoolFuerGruppe(stimmenExtendedDAO, ergebnisSelected, politischeGruppe));

  }

  @Override
  protected Comparator< ? super KandidaturKumulierteStimmen> getDefaultComparator() {
    return kandidaturKumulierteStimmenBuilder.getDefaultComparator();
  }
}
