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

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

import javax.inject.Inject;

import de.ivu.elect.business.gebietsbaum.boundary.GebietExtendedDAO;
import de.ivu.elect.business.gebietsbaum.control.FilterByGebiet;
import de.ivu.elect.business.gebietsbaum.control.FilterByGebietParameter;
import de.ivu.elect.business.gebietsbaum.entity.Gebiet;
import de.ivu.elect.business.personenpruefung.entity.PersonenKonflikt;
import de.ivu.elect.jee.entity.EagerLoadingCollector;

public abstract class AbstractPersonenKonfliktByGebietSearch<P extends AbstractPersonenKonfliktByGebietSearchParameters>
    extends
      AbstractPersonenKonfliktSearch<P> {

  private static final long serialVersionUID = 1L;

  @Inject
  protected GebietExtendedDAO gebietDao;

  @Inject
  protected FilterByGebiet<PersonenKonflikt> filterByGebiet;

  public AbstractPersonenKonfliktByGebietSearch() {
    super();
  }

  @Override
  public List<PersonenKonflikt> getSearchResult(P searchParameters, EagerLoadingCollector<PersonenKonflikt> eagerLoadingCollector) {
    verifySearchParameters(searchParameters);

    List<PersonenKonflikt> searchResult = super.getSearchResult(searchParameters, eagerLoadingCollector);
    List<PersonenKonflikt> filterResult = getFilterByGebietResult(searchResult, searchParameters);

    sortSearchResult(filterResult, searchParameters);

    return filterResult;
  }

  private void verifySearchParameters(P searchParameters) {
    if (!searchParameters.hasGebiet()) {
      throw new IllegalArgumentException("Gebiet des Suchparameters darf nicht null sein");
    }
  }

  protected List<PersonenKonflikt> getFilterByGebietResult(Collection<PersonenKonflikt> searchResult,
      AbstractPersonenKonfliktByGebietSearchParameters searchParameters) {
    FilterByGebietParameter filterParameter = new FilterByGebietParameter(attach(searchParameters.getGebiet()),
        searchParameters.isIncludeUntergebiete());

    return new ArrayList<>(filterByGebiet.filterByGebiet(new ArrayList<>(searchResult), filterParameter));
  }

  private Gebiet attach(Gebiet gebiet) {
    return gebietDao.attach(gebiet);
  }
}
