
package de.ivu.elect.dokumente.ergebnistabelle.kandidaten;

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

import de.ivu.elect.business.ergebnis.control.ErgebnisDatenListenkandidaturen;
import de.ivu.elect.business.ergebnis.entity.Stimmen;
import de.ivu.elect.business.gebietsbaum.entity.Gebiet;
import de.ivu.elect.business.gebietsbaum.entity.Wahldurchfuehrungsgebiet;
import de.ivu.elect.business.gruppe.entity.Gruppe;
import de.ivu.elect.business.kandidatur.control.ListenkandidaturByRelativePositionComparator;
import de.ivu.elect.business.kandidatur.entity.Listenkandidatur;
import de.ivu.elect.core.exchange.stimmen.csv.AbstractStimmenMapper;

public class ListenkandidaturenErgebnistabelleCsvDTOFactory extends AbstractStimmenMapper {

  public ListenkandidaturenErgebnistabelleCsvDTOFactory() {
    super();
  }

  public ListenkandidaturenErgebnistabelleCsvDTO createListenkandidaturenErgebnistabelleCsvDTO(ListenkandidaturenErgebnistabelleZeilenSchluessel schluessel,
      ErgebnisDatenListenkandidaturen listenkandidaturDaten, Map<Gebiet, Map<Gruppe, List<Stimmen>>> systemgruppenStimmenByGebietUndGruppe) {
    ListenkandidaturenErgebnistabelleCsvDTO dto = new ListenkandidaturenErgebnistabelleCsvDTO(schluessel);

    addWahlberechtigteToCsvDTO(dto, schluessel.getGebiet(), schluessel.getStimmabgabeart(), systemgruppenStimmenByGebietUndGruppe);
    addWaehlerToCsvDTO(dto, schluessel.getGebiet(), schluessel.getStimmabgabeart(), systemgruppenStimmenByGebietUndGruppe);

    addListenkandidaturenToCsvDTO(dto, schluessel, listenkandidaturDaten);

    return dto;
  }

  protected void addListenkandidaturenToCsvDTO(ListenkandidaturenErgebnistabelleCsvDTO dto, ListenkandidaturenErgebnistabelleZeilenSchluessel schluessel,
      ErgebnisDatenListenkandidaturen listenkandidaturDaten) {

    Map<Listenkandidatur, Long> stimmenFuerListenkandidaturen = listenkandidaturDaten.collectStimmenPerListenkandidatur(schluessel.getPolitischeGruppeUndGebietUndStimmabgabeart());

    for (Listenkandidatur listenkandidatur : getRelevanteListenkandidaturenSortiert(schluessel.getGruppe(), schluessel.getGebiet(), listenkandidaturDaten)) {
      dto.addListenkandidaturStimmen(notNull(stimmenFuerListenkandidaturen.get(listenkandidatur)));
    }

  }

  public List<Listenkandidatur> getRelevanteListenkandidaturenSortiert(Gruppe gruppe, Wahldurchfuehrungsgebiet gebiet, ErgebnisDatenListenkandidaturen ergebnisDatenListenkandidaturen) {
    List<Listenkandidatur> result = new ArrayList<>(ergebnisDatenListenkandidaturen.getListenkandidaturenAufStimmzettelFuerGruppeAufGebiet(gruppe, gebiet));
    Collections.sort(result, new ListenkandidaturByRelativePositionComparator());

    return result;
  }

}
