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

import java.io.Serializable;
import java.util.List;
import java.util.Map;
import java.util.function.Function;
import java.util.stream.Collectors;

import javax.inject.Inject;

import de.ivu.elect.business.ergebnis.boundary.ErgebnisDAO;
import de.ivu.elect.business.ergebnis.boundary.StimmenDAO;
import de.ivu.elect.business.ergebnis.entity.Ergebnis;
import de.ivu.elect.business.ergebnis.entity.ReadOnlyGruppenStimmen;
import de.ivu.elect.business.ergebnis.entity.Stimmen;
import de.ivu.elect.business.gebietsbaum.boundary.GebietDAO;
import de.ivu.elect.business.gebietsbaum.entity.Gebiet;
import de.ivu.elect.business.gruppe.boundary.GruppeDAO;
import de.ivu.elect.business.gruppe.entity.Gruppe;
import de.ivu.elect.business.wahlvorschlag.boundary.ReferendumOptionDAO;
import de.ivu.elect.business.wahlvorschlag.entity.ReferendumOption;

/**
 *  on 25.01.2016.
 */
public class ReadonlyStimmenLoader implements Serializable {


  @Inject
  private transient StimmenDAO stimmenDAO;

  @Inject
  private transient ErgebnisDAO ergebnisDAO;

  @Inject
  private transient GebietDAO gebietDAO;

  @Inject
  private transient GruppeDAO gruppeDAO;

  @Inject
  private transient ReferendumOptionDAO referendumOptionDAO;


  public List<Stimmen> readGruppenStimmen(Ergebnis ergebnis) {

    List<ReadOnlyGruppenStimmen> result = stimmenDAO.findByErgebnisOhneListenkandidaturenReadOnlyNoCache(ergebnis);

    init(ergebnis, result);
    List result2 = result;
    return result2;
  }

  protected void init(Ergebnis ergebnis, List<ReadOnlyGruppenStimmen> result) {
    Map<Long, Ergebnis> ergebnisNachId =  ergebnisDAO.findByAll().stream().collect(Collectors.toMap(Ergebnis::getId, Function.identity()));
    Map<Long, Gebiet> gebietNachId = gebietDAO.findByWahl(ergebnis.getWahl()).stream().collect(Collectors.toMap(Gebiet::getId, Function.identity()));
    Map<Long, Gruppe> gruppeNachId = gruppeDAO.findByWahl(ergebnis.getWahl()).stream().collect(Collectors.toMap(Gruppe::getId, Function.identity()));
    Map<Long, ReferendumOption> refrendumOptionNachId = referendumOptionDAO.findByWahl(ergebnis.getWahl()).stream()
        .collect(Collectors.toMap(ReferendumOption::getId, Function.identity()));

    result.forEach(s -> s.init(ergebnisNachId, gebietNachId, gruppeNachId, refrendumOptionNachId));
  }

  public List<Stimmen> findByErgebnisAndIsSystemGruppe(Ergebnis ergebnis) {
    List<ReadOnlyGruppenStimmen> result = stimmenDAO.findByErgebnisAndIsSystemGruppeReadOnlyNoCache(ergebnis);
    init(ergebnis, result);
    List result2 = result;
    return result2;
  }
}
