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

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

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

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.GemeindeTabelle;
import de.ivu.elect.was.exchange.ergebnis.zusammenstellung.ErgebnisZusammenstellung.StimmzettelgebietTabelle;
import de.ivu.elect.was.exchange.ergebnis.zusammenstellung.ErgebnisZusammenstellungDokument;

public class ErgebnisGesamtergebnisTabellarisch {

  private final ErgebnisZusammenstellungDokument dokument;

  public ErgebnisGesamtergebnisTabellarisch(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 collectGemeindeTabellen(stimmzettelgebiet).stream().map(GemeindeTabelle::getGemeinde).collect(toList());
  }

  public List<StimmzettelgebietTabelle> collectStimmzettelgebietTabellen(WahlverwaltungGebietInformation stimmzettelgebiet) {
    return new ErgebnisZusammenstellung(dokument).getStimmzettelgebietTabelle(stimmzettelgebiet).map(Collections::singletonList).orElse(emptyList());
  }

  public List<GemeindeTabelle> collectGemeindeTabellen(WahlverwaltungGebietInformation stimmzettelgebiet) {
    return new ErgebnisZusammenstellung(dokument).collectGemeindeTabellen(stimmzettelgebiet).stream() //
        .sorted((one, another) -> ErgebnisTabellarischTabelle.GEMEINDE_INFORMATION_DEFAULT_COMPARATOR.compare(one.getGemeinde(), another.getGemeinde())) //
        .collect(toList());
  }
}
