
package de.ivu.elect.dokumente.ergebnis.kandidatur;

import static java.util.stream.Collectors.toList;

import java.util.ArrayList;
import java.util.List;
import java.util.SortedMap;
import java.util.TreeMap;

import de.ivu.elect.business.gebietsbaum.boundary.WahlverwaltungGebietInformation;
import de.ivu.elect.business.gebietsbaum.boundary.WahlverwaltungGemeindeInformation;
import de.ivu.elect.dokumente.ergebnis.zusammenstellung.ErgebnisTabellarischTabelle;
import de.ivu.elect.was.exchange.ergebnis.zusammenstellung.ErgebnisZusammenstellung;
import de.ivu.elect.was.exchange.ergebnis.zusammenstellung.ErgebnisZusammenstellung.GemeindeGruppeTabellen;
import de.ivu.elect.was.exchange.ergebnis.zusammenstellung.ErgebnisZusammenstellung.GruppeGemeindeTabellen;
import de.ivu.elect.was.exchange.ergebnis.zusammenstellung.ErgebnisZusammenstellung.GruppeStimmzettelgebietTabelle;
import de.ivu.elect.was.exchange.ergebnis.zusammenstellung.ErgebnisZusammenstellungDokument;
import de.ivu.elect.was.exchange.ergebnis.zusammenstellung.ErgebnisZusammenstellungGruppe;

public class ErgebnisKandidaturenTabellarisch {

  private final ErgebnisZusammenstellungDokument dokument;

  public ErgebnisKandidaturenTabellarisch(ErgebnisZusammenstellungDokument dokument) {
    super();

    this.dokument = dokument;
  }

  public List<WahlverwaltungGebietInformation> collectStimmzettelgebiete() {
    List<WahlverwaltungGebietInformation> stimmzettelgebiete = new ArrayList<>(dokument.getStimmzettelgebiete());
    stimmzettelgebiete.sort(ErgebnisTabellarischTabelle.GEBIET_INFORMATION_DEFAULT_COMPARATOR);

    return stimmzettelgebiete;
  }

  public List<WahlverwaltungGemeindeInformation> collectGemeinden(WahlverwaltungGebietInformation stimmzettelgebiet) {
    return collectTabellenPerGemeinde(stimmzettelgebiet).keySet().stream().collect(toList());
  }

  public SortedMap<ErgebnisZusammenstellungGruppe, GruppeStimmzettelgebietTabelle> collectTabellenPerGruppeStimmzettelgebiet(WahlverwaltungGebietInformation stimmzettelgebiet) {
    SortedMap<ErgebnisZusammenstellungGruppe, GruppeStimmzettelgebietTabelle> result = new TreeMap<>(ErgebnisZusammenstellungGruppe.DEFAULT_COMPARATOR);

    for (GruppeStimmzettelgebietTabelle gruppeStimmzettelgebietTabellen : new ErgebnisZusammenstellung(dokument).collectGruppeStimmzettelgebietTabellen(stimmzettelgebiet)) {
      result.put(gruppeStimmzettelgebietTabellen.getGruppe(), gruppeStimmzettelgebietTabellen);
    }

    return result;
  }

  public SortedMap<ErgebnisZusammenstellungGruppe, GruppeGemeindeTabellen> collectTabellenPerGruppeGemeinden(WahlverwaltungGebietInformation stimmzettelgebiet) {
    SortedMap<ErgebnisZusammenstellungGruppe, GruppeGemeindeTabellen> result = new TreeMap<>(ErgebnisZusammenstellungGruppe.DEFAULT_COMPARATOR);

    for (GruppeGemeindeTabellen gruppeGemeindeTabellen : new ErgebnisZusammenstellung(dokument).collectGruppeGemeindeTabellen(stimmzettelgebiet)) {
      result.put(gruppeGemeindeTabellen.getGruppe(), gruppeGemeindeTabellen);
    }

    return result;
  }

  public SortedMap<WahlverwaltungGemeindeInformation, GemeindeGruppeTabellen> collectTabellenPerGemeinde(WahlverwaltungGebietInformation stimmzettelgebiet) {
    SortedMap<WahlverwaltungGemeindeInformation, GemeindeGruppeTabellen> result = new TreeMap<>(ErgebnisTabellarischTabelle.GEMEINDE_INFORMATION_DEFAULT_COMPARATOR);

    for (GemeindeGruppeTabellen gemeindeGruppeTabellen : new ErgebnisZusammenstellung(dokument).collectGemeindeGruppeTabellen(stimmzettelgebiet)) {
      result.put(gemeindeGruppeTabellen.getGemeinde(), gemeindeGruppeTabellen);
    }

    return result;
  }
}
