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

import static java.util.Collections.sort;

import java.util.ArrayList;
import java.util.Collection;
import java.util.List;

import javax.ejb.Stateless;
import javax.inject.Inject;

import de.ivu.elect.business.gebietsbaum.boundary.GebietDAO;
import de.ivu.elect.business.gebietsbaum.control.FilterByGebiet;
import de.ivu.elect.business.gebietsbaum.control.FilterByGebietParameter;
import de.ivu.elect.business.niederschrift.entity.NiederschriftKorrektur;
import de.ivu.elect.business.niederschrift.entity.NiederschriftKorrekturByZeitstempelComparator;

@Stateless
public class NiederschriftKorrekturSearch extends AbstractNiederschriftKorrekturSearch {

  @Inject
  private GebietDAO gebietDAO;

  @Inject
  private NiederschriftKorrekturExtendedDAO niederschriftKorrekturDAO;

  @Inject
  private FilterByGebiet<NiederschriftKorrektur> filterByGebiet;

  @Override
  protected List<NiederschriftKorrektur> querySearchResult(NiederschriftKorrekturSearchParameters searchParameters) {
    List<NiederschriftKorrektur> result = niederschriftKorrekturDAO.findByWahl(searchParameters.getGebiet().getWahl());

    result = filterByGebiet(searchParameters, result);
    sort(result, new NiederschriftKorrekturByZeitstempelComparator());

    return result;
  }

  private List<NiederschriftKorrektur> filterByGebiet(NiederschriftKorrekturSearchParameters searchParameters, Collection<NiederschriftKorrektur> orderedEntities) {
    List<NiederschriftKorrektur> result = new ArrayList<>(orderedEntities);
    result.retainAll(filterByGebiet.filterByGebiet(new ArrayList<>(orderedEntities), createFilterByGebietParameter(searchParameters)));

    return result;
  }

  private FilterByGebietParameter createFilterByGebietParameter(NiederschriftKorrekturSearchParameters searchParameters) {
    return new FilterByGebietParameter(gebietDAO.attach(searchParameters.getGebiet()), searchParameters.isIncludeUntergebiete());
  }
}
