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.ErgebnisExtendedDAO;
import de.ivu.elect.business.ergebnis.boundary.StimmenExtendedDAO;
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.GebietExtendedDAO;
import de.ivu.elect.business.gebietsbaum.entity.Gebiet;
import de.ivu.elect.business.gruppe.boundary.GruppeExtendedDAO;
import de.ivu.elect.business.gruppe.entity.Gruppe;
import de.ivu.elect.business.wahlvorschlag.boundary.ReferendumOptionExtendedDAO;
import de.ivu.elect.business.wahlvorschlag.entity.ReferendumOption;

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


  @Inject
  private transient StimmenExtendedDAO stimmenExtendedDAO;

  @Inject
  private transient ErgebnisExtendedDAO ergebnisExtendedDAO;

  @Inject
  private transient GebietExtendedDAO gebietExtendedDAO;

  @Inject
  private transient GruppeExtendedDAO gruppeExtendedDAO;

  @Inject
  private transient ReferendumOptionExtendedDAO referendumOptionExtendedDAO;


  public List<Stimmen> readGruppenStimmen(Ergebnis ergebnis) {

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

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

  protected void init(Ergebnis ergebnis, List<ReadOnlyGruppenStimmen> result) {
    Map<Long, Ergebnis> ergebnisNachId =  ergebnisExtendedDAO.findByAll().stream().collect(Collectors.toMap(Ergebnis::getId, Function.identity()));
    Map<Long, Gebiet> gebietNachId = gebietExtendedDAO.findByWahl(ergebnis.getWahl()).stream().collect(Collectors.toMap(Gebiet::getId, Function.identity()));
    Map<Long, Gruppe> gruppeNachId = gruppeExtendedDAO.findByWahl(ergebnis.getWahl()).stream().collect(Collectors.toMap(Gruppe::getId, Function.identity()));
    Map<Long, ReferendumOption> refrendumOptionNachId = referendumOptionExtendedDAO.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 = stimmenExtendedDAO.findByErgebnisAndIsSystemGruppeReadOnlyNoCache(ergebnis);
    init(ergebnis, result);
    List result2 = result;
    return result2;
  }
}
