
package de.ivu.elect.business.stimmeingabe.entity;

import de.ivu.elect.business.gebietsbaum.entity.GebietTK;
import de.ivu.elect.business.gruppe.entity.GruppeTK;
import de.ivu.elect.business.gruppeimgebiet.entity.GruppeImGebiet;
import de.ivu.elect.business.gruppeimgebiet.entity.GruppeImGebietTK;
import de.ivu.elect.business.stimmzettel.entity.EntityAufStimmzettelDaten;
import de.ivu.elect.business.wahlvorschlag.entity.Wahlvorschlag;

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

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

public class StimmeingabeImporterGigContext {

  private final List<GruppeImGebiet> gruppenImGebietInWahl;

  private Map<GebietTK, List<GruppeImGebiet>> gigNachGebietTkMap;

  private final Map<GruppeImGebiet, GruppeImGebietTK> gruppeInGebietAusDateiTKCache = new HashMap<>();

  private List<Wahlvorschlag> wahlvorschlaegeInWahl = null;

  private final EntityAufStimmzettelDaten entityAufStimmzettelDaten;
  private final Map<GruppeTK, List<Wahlvorschlag>> direktkandidatenPerGruppeInWahlgebietTk;

  public StimmeingabeImporterGigContext(List<GruppeImGebiet> gruppenImGebietInWahl, List<Wahlvorschlag> wahlvorschlaegeInWahl, EntityAufStimmzettelDaten entityAufStimmzettelDaten) {
    super();

    this.gruppenImGebietInWahl = gruppenImGebietInWahl;
    this.wahlvorschlaegeInWahl = wahlvorschlaegeInWahl;

    this.direktkandidatenPerGruppeInWahlgebietTk = wahlvorschlaegeInWahl.stream()
            .filter(Wahlvorschlag::isDirektkandidat)
            .collect(groupingBy(wahlvorschlag -> wahlvorschlag.getGruppe().getGruppeTK()));

    this.entityAufStimmzettelDaten = entityAufStimmzettelDaten;
  }

  public Map<GebietTK, List<GruppeImGebiet>> getGigNachGebietTkMap() {
    if (gigNachGebietTkMap == null) {
      gigNachGebietTkMap = gruppenImGebietInWahl.stream().collect(groupingBy(gig -> gig.getGebiet().getGebietTK()));
    }
    return gigNachGebietTkMap;
  }

  public Map<GruppeImGebiet, GruppeImGebietTK> getGruppeInGebietAusDateiTKCache() {
    return gruppeInGebietAusDateiTKCache;
  }

  public List<Wahlvorschlag> getAlleWahlvorschlaegeDerWahlInDb() {
    return wahlvorschlaegeInWahl;
  }

  public EntityAufStimmzettelDaten getEntityAufStimmzettelDaten() {
    return entityAufStimmzettelDaten;
  }

  public boolean existsDirektkandidatInDb(GruppeImGebiet gruppeImGebiet) {
    if(gruppeImGebiet != null){
      GruppeImGebietTK gruppeImGebietTK = gruppeImGebiet.getGruppeImGebietTK();

      if(gruppeImGebietTK !=null) {

        return direktkandidatenPerGruppeInWahlgebietTk.getOrDefault(gruppeImGebietTK.getGruppeTK(), new ArrayList<>()).stream() //
        .anyMatch(wahlvorschlag-> wahlvorschlag.getGebiet().isInGebietshierarchieUebergeordnetesGebietVon(gruppeImGebiet.getGebiet()));
    }}

    return false;
  }
}
