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

import java.util.Collections;
import java.util.Comparator;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.stream.Collectors;

import javax.inject.Inject;

import org.apache.commons.lang3.StringUtils;

import de.ivu.elect.business.DateUtil;
import de.ivu.elect.business.ergebnis.boundary.ErgebnisExtendedDAO;
import de.ivu.elect.business.ergebnis.entity.Ergebnis;
import de.ivu.elect.business.ergebnis.entity.ErgebnisPK;
import de.ivu.elect.business.praesentation.entity.PraesentationStatistikEntry;
import de.ivu.elect.business.praesentation.entity.PraesentationStatistikSearchResult;

public class PraesentationStatistikSearch {

  @Inject
  private transient ErgebnisExtendedDAO ergebnisExtendedDAO;

  @Inject
  private transient PraesentationStatistikStore praesentationStatistikStore;

  public List<PraesentationStatistikSearchResult> getSearchResult(PraesentationStatistikSearchParameters searchParameters) {

    Map<ErgebnisPK, List<PraesentationStatistikEntry>> praesentationsStatistiken = praesentationStatistikStore.getStatistiken();

    Set<ErgebnisPK> alleErgebnisse = new HashSet<>(praesentationsStatistiken.keySet());

    return alleErgebnisse.stream().map(e -> ergebnisExtendedDAO.findByPrimaryKey(e)).filter(e -> filter(e, searchParameters)).sorted(getComparator())
        .map(Ergebnis::getPk).map(e -> new PraesentationStatistikSearchResult(e,
            praesentationsStatistiken.getOrDefault(e, Collections.emptyList()))).collect(Collectors.toList());

  }

  protected Comparator<Ergebnis> getComparator() {
    Comparator<Ergebnis> c1 = Comparator.comparing(u -> u.getMandant().getNummer());
    Comparator<Ergebnis> c2 = Comparator.comparing(u -> u.getWahl().getWahldatum());
    Comparator<Ergebnis> c3 = Comparator.comparing(u -> u.getWahl().getWahlart().getName());
    Comparator<Ergebnis> c4 = Comparator.comparing(Ergebnis::getErgebnisart);

    return c1.thenComparing(c2).thenComparing(c3).thenComparing(c4);
  }

  private boolean filter(Ergebnis ergebnis, PraesentationStatistikSearchParameters searchParameters) {

    if (ergebnis == null) {
      return false;
    }
    if (searchParameters.getErgebnisart() != null && !searchParameters.getErgebnisart().equals(ergebnis.getErgebnisart())) {
      return false;
    }

    if (searchParameters.getMandantPK() != null && !searchParameters.getMandantPK().equals(ergebnis.getMandant().getPk())) {
      return false;
    }

    if (searchParameters.getWahldatum() != null && !DateUtil.isSameDay(searchParameters.getWahldatum(), ergebnis.getWahl().getWahldatum())) {
      return false;
    }

    if (searchParameters.getWahlart() != null && !StringUtils.equalsIgnoreCase(searchParameters.getWahlart(), ergebnis.getWahl().getWahlart().getName())) {
      return false;
    }

    return true;
  }

}
