
package de.ivu.elect.presentation.ergebnis.dokumente.wahlbuch;

import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

import de.ivu.elect.business.ergebnis.control.ErgebnisDaten;
import de.ivu.elect.business.gebietsbaum.entity.Wahldurchfuehrungsgebiet;
import de.ivu.elect.business.gruppe.entity.PolitischeGruppe;

public class PolitischeGruppenFuerPraesentationBestimmer {

  protected final ErgebnisDaten ergebnisDaten;
  private final Map<Wahldurchfuehrungsgebiet, List<PolitischeGruppe>> politischeGruppenFuerPraesentationProGebiet = new HashMap<>();
  private final Map<Wahldurchfuehrungsgebiet, List<PolitischeGruppe>> politischeGruppenNichtFuerPraesentationProGebiet = new HashMap<>();

  public PolitischeGruppenFuerPraesentationBestimmer(ErgebnisDaten ergebnisDaten) {
    this.ergebnisDaten = ergebnisDaten;
  }

  public List<PolitischeGruppe> getPolitischeGruppenFuerPraesentation(
      Wahldurchfuehrungsgebiet wahldurchfuehrungsgebiet) {
    return politischeGruppenFuerPraesentationProGebiet.computeIfAbsent(wahldurchfuehrungsgebiet,
        g -> initPolitischeGruppenFuerPraesentationProGebiet(g));
  }

  private List<PolitischeGruppe> initPolitischeGruppenFuerPraesentationProGebiet(
      Wahldurchfuehrungsgebiet wahldurchfuehrungsgebiet) {
    return ergebnisDaten.getPolitischeGruppenSortiertNachPositionAufGebiet(wahldurchfuehrungsgebiet).stream()
        .filter(pg -> isInPraesentation(pg, wahldurchfuehrungsgebiet)).collect(Collectors.toList());
  }

  protected boolean isInPraesentation(PolitischeGruppe politischeGruppe,
      Wahldurchfuehrungsgebiet wahldurchfuehrungsgebiet) {

    return politischeGruppe.getInPraesentation();
  }

  public List<PolitischeGruppe> getPolitischeGruppenNichtFuerPraesentation(
      Wahldurchfuehrungsgebiet wahldurchfuehrungsgebiet) {
    return politischeGruppenNichtFuerPraesentationProGebiet.computeIfAbsent(wahldurchfuehrungsgebiet,
        g -> initPolitischeGruppenNichtFuerPraesentation(g));
  }

  private List<PolitischeGruppe> initPolitischeGruppenNichtFuerPraesentation(
      Wahldurchfuehrungsgebiet wahldurchfuehrungsgebiet) {
    return ergebnisDaten.getPolitischeGruppenZugelassenSortiertNachPositionAufGebiet(wahldurchfuehrungsgebiet).stream()
        .filter(pg -> !getPolitischeGruppenFuerPraesentation(wahldurchfuehrungsgebiet).contains(pg))
        .collect(Collectors.toList());
  }
}
