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

import java.util.ArrayList;
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.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.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;

  public KandidaturKumulierteStimmenSearch() {
    super();
  }

  @Override
  protected List<KandidaturKumulierteStimmen> suche(Wahl wahl, Gebiet gebietSelected, Ergebnis ergebnisSelected, KandidaturKumulierteStimmenSearchParameters searchParameters) {
    Gebiet gebiet = gebietExtendedDAO.attach(gebietSelected);
    PolitischeGruppe politischeGruppe = politischeGruppeExtendedDAO.attach(searchParameters.getGruppe());

    if (gebiet == null || politischeGruppe == null) {
      return new ArrayList<>();
    }

    boolean gruppeListenstimmenSummenErzeugen = isGruppeListenstimmenSeparatErfassbar(gebiet); // ELECTKOM-2832

    return kandidaturKumulierteStimmenBuilder.erzeugeKandidaturKumulierteStimmenFuerGruppeAufGebiet(gebiet, politischeGruppe, gruppeListenstimmenSummenErzeugen,
        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();
  }
}
