package de.ivu.elect.business.statistik.control;

import java.io.Serializable;
import java.util.Collections;
import java.util.List;

import javax.annotation.Nullable;
import javax.inject.Inject;

import de.ivu.elect.business.gebietsbaum.boundary.GebietExtendedDAO;
import de.ivu.elect.business.gebietsbaum.entity.Gebiet;
import de.ivu.elect.business.statistik.boundary.StatistikKennzeichenExtendedDAO;
import de.ivu.elect.business.statistik.boundary.StatistikLaufExtendedDAO;
import de.ivu.elect.business.statistik.entity.StatistikKennzeichen;
import de.ivu.elect.business.statistik.entity.StatistikLauf;
import de.ivu.elect.business.statistik.entity.StatistikSearchEntity;
import de.ivu.elect.business.wahl.boundary.WahlExtendedDAO;
import de.ivu.elect.business.wahl.entity.Wahl;
import de.ivu.elect.jee.entity.EagerLoadingCollector;

/**
 *  on 01.02.2017.
 */
public abstract class AbstractStatistikSearch<T extends StatistikSearchEntity, SP extends AbstractStatistikSearchParameters> implements Serializable {

  @Inject
  transient StatistikLaufExtendedDAO statistikLaufExtendedDAO;

  @Inject
  transient StatistikKennzeichenExtendedDAO statistikKennzeichenDAO;

  @Inject
  transient GebietExtendedDAO gebietExtendedDAO;

  @Inject
  transient WahlExtendedDAO wahlExtendedDAO;

  public List<T> getSearchResult(SP searchParameters, EagerLoadingCollector<T> eagerLoadingCollector) {
    if (searchParameters.getStatistikLauf() == null) {
      return Collections.emptyList();
    }
    Wahl wahl = wahlExtendedDAO.attach(searchParameters.getWahl());
    StatistikLauf statistikLauf = statistikLaufExtendedDAO.attach(searchParameters.getStatistikLauf());
    Gebiet gebiet = gebietExtendedDAO.attach(searchParameters.getGebiet());
    List<StatistikKennzeichen> kenzeichen = statistikKennzeichenDAO.findByLauf(statistikLauf);
    List<T> result = getSearchResult(statistikLauf, kenzeichen, wahl, gebiet, searchParameters);

    return eagerLoadingCollector.eagerLoad(result);
  }

  protected abstract List<T> getSearchResult(StatistikLauf statistikLauf, List<StatistikKennzeichen> kenzeichen, @Nullable Wahl wahl, Gebiet gebiet, SP searchParameters);
}
