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

import java.util.Collections;
import java.util.List;
import java.util.Map;

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

import de.ivu.elect.business.gebietsbaum.entity.Gebiet;
import de.ivu.elect.business.gebietsbaum.entity.Gebietsart;
import de.ivu.elect.business.gebietsbaum.entity.GebietsartPK;
import de.ivu.elect.business.wahl.entity.Wahl;
import de.ivu.elect.business.wahl.entity.Wahltermin;


import static java.util.stream.Collectors.counting;
import static java.util.stream.Collectors.groupingBy;

/**
 *  on 28.10.2016.
 */
@Stateless
public class GebietStatusuebersicht {

  @Inject
  GebietDAO gebietDAO;

  public Map<GebietsartPK, Long> getAnzahlGebieteProArt(Wahltermin wahltermin, Wahl wahl, Gebiet gebietNotAttached) {
    if (gebietNotAttached == null || (wahltermin == null && wahl == null)) {
      return Collections.emptyMap();
    }

    List<Gebiet> alleGebiete;
    if (wahl != null) {
      alleGebiete = gebietDAO.findByWahl(wahl);
    } else {
      alleGebiete = gebietDAO.findByWahltermin(wahltermin);
    }

    Gebiet gebiet = gebietDAO.attach(gebietNotAttached);

    return alleGebiete.stream()
        .filter(g -> g.isEqualOderUntergebietVon(gebiet))
        .map(Gebiet::getGebietsart)
        .collect(groupingBy(Gebietsart::getPk, counting()));
  }

}
