
package de.ivu.elect.was.exchange.ergebnis.zusammenstellung;

import static java.util.Collections.unmodifiableCollection;
import static java.util.Collections.unmodifiableSet;

import java.util.Collection;
import java.util.HashSet;
import java.util.Set;

import de.ivu.elect.business.gebietsbaum.boundary.WahlverwaltungGebietInformation;
import de.ivu.elect.business.gebietsbaum.boundary.WahlverwaltungGemeindeInformation;

public class ErgebnisZusammenstellungTabelle {

  private final WahlverwaltungGebietInformation stimmzettelgebiet;

  private final Collection<WahlverwaltungGebietInformation> wahlkreise;

  private final Collection<WahlverwaltungGebietInformation> stimmkreise;

  private final Collection<WahlverwaltungGebietInformation> wahlbereiche;

  private final Collection<WahlverwaltungGebietInformation> bundeslaender;

  private final Collection<WahlverwaltungGebietInformation> kreise;

  private final Collection<WahlverwaltungGemeindeInformation> gemeindeverbaende;

  private final Collection<WahlverwaltungGemeindeInformation> gemeindenVerbandsfrei;

  private final Collection<WahlverwaltungGemeindeInformation> gemeinden;

  private final Collection<WahlverwaltungGebietInformation> stadtbezirke;

  private final Collection<WahlverwaltungGebietInformation> ortsbezirke;

  private final Collection<WahlverwaltungGebietInformation> stadtteile;

  private final Collection<WahlverwaltungGebietInformation> ortsteile;

  private final Collection<ErgebnisZusammenstellungGruppe> gruppen;

  private final Collection<ErgebnisZusammenstellungZeile> zeilen;

  public ErgebnisZusammenstellungTabelle(ErgebnisZusammenstellungTabelle template, Collection<ErgebnisZusammenstellungZeile> zeilen) {
    this(template.getStimmzettelgebiet(), zeilen);
  }

  public ErgebnisZusammenstellungTabelle(WahlverwaltungGebietInformation stimmzettelgebiet, Collection<ErgebnisZusammenstellungZeile> zeilen) {
    super();

    this.stimmzettelgebiet = stimmzettelgebiet;

    Set<WahlverwaltungGebietInformation> wahlkreise = new HashSet<>();
    Set<WahlverwaltungGebietInformation> stimmkreise = new HashSet<>();
    Set<WahlverwaltungGebietInformation> wahlbereiche = new HashSet<>();

    Set<WahlverwaltungGebietInformation> bundeslaender = new HashSet<>();
    Set<WahlverwaltungGebietInformation> kreise = new HashSet<>();
    Set<WahlverwaltungGemeindeInformation> gemeindeverbaende = new HashSet<>();
    Set<WahlverwaltungGemeindeInformation> gemeindenVerbandsfrei = new HashSet<>();
    Set<WahlverwaltungGemeindeInformation> gemeinden = new HashSet<>();
    Set<WahlverwaltungGebietInformation> stadtbezirke = new HashSet<>();
    Set<WahlverwaltungGebietInformation> ortsbezirke = new HashSet<>();
    Set<WahlverwaltungGebietInformation> stadtteile = new HashSet<>();
    Set<WahlverwaltungGebietInformation> ortsteile = new HashSet<>();

    Set<ErgebnisZusammenstellungGruppe> gruppen = new HashSet<>();

    for (ErgebnisZusammenstellungZeile zeile : zeilen) {
      ErgebnisZusammenstellungZeileDatengebiet datengebiet = zeile.getDatengebiet();

      WahlverwaltungGebietInformation wahlkreis = datengebiet.getWahlkreis();
      if (!wahlkreis.isUnbekannt()) {
        wahlkreise.add(wahlkreis);
      }

      WahlverwaltungGebietInformation stimmkreis = datengebiet.getStimmkreis();
      if (!stimmkreis.isUnbekannt()) {
        stimmkreise.add(stimmkreis);
      }

      WahlverwaltungGebietInformation wahlbereich = datengebiet.getWahlbereich();
      if (!wahlbereich.isUnbekannt()) {
        wahlbereiche.add(wahlbereich);
      }

      WahlverwaltungGebietInformation bundesland = datengebiet.getBundesland();
      if (!bundesland.isUnbekannt()) {
        bundeslaender.add(bundesland);
      }

      WahlverwaltungGebietInformation kreis = datengebiet.getKreis();
      if (!kreis.isUnbekannt()) {
        kreise.add(kreis);
      }

      WahlverwaltungGemeindeInformation gemeindeverband = datengebiet.getGemeindeverband();
      WahlverwaltungGemeindeInformation gemeinde = datengebiet.getGemeinde();

      if (gemeindeverband.isUnbekannt()) {
        if (!gemeinde.isUnbekannt()) {
          gemeindenVerbandsfrei.add(gemeinde);
        }
      } else {
        gemeindeverbaende.add(gemeindeverband);
      }

      if (!gemeinde.isUnbekannt()) {
        gemeinden.add(gemeinde);
      }

      WahlverwaltungGebietInformation stadtbezirk = datengebiet.getStadtbezirk();
      if (!stadtbezirk.isUnbekannt()) {
        stadtbezirke.add(stadtbezirk);
      }

      WahlverwaltungGebietInformation ortsbezirk = datengebiet.getOrtsbezirk();
      if (!ortsbezirk.isUnbekannt()) {
        ortsbezirke.add(ortsbezirk);
      }

      WahlverwaltungGebietInformation stadtteil = datengebiet.getStadtteil();
      if (!stadtteil.isUnbekannt()) {
        stadtteile.add(stadtteil);
      }

      WahlverwaltungGebietInformation ortsteil = datengebiet.getOrtsteil();
      if (!ortsteil.isUnbekannt()) {
        ortsteile.add(ortsteil);
      }

      gruppen.addAll(zeile.getGruppen());
    }

    this.wahlkreise = unmodifiableSet(wahlkreise);
    this.stimmkreise = unmodifiableSet(stimmkreise);
    this.wahlbereiche = unmodifiableSet(wahlbereiche);

    this.bundeslaender = unmodifiableSet(bundeslaender);
    this.kreise = unmodifiableSet(kreise);
    this.gemeindeverbaende = unmodifiableSet(gemeindeverbaende);
    this.gemeindenVerbandsfrei = unmodifiableSet(gemeindenVerbandsfrei);
    this.gemeinden = unmodifiableSet(gemeinden);
    this.stadtbezirke = unmodifiableSet(stadtbezirke);
    this.ortsbezirke = unmodifiableSet(ortsbezirke);
    this.stadtteile = unmodifiableSet(stadtteile);
    this.ortsteile = unmodifiableSet(ortsteile);

    this.gruppen = unmodifiableSet(gruppen);

    this.zeilen = unmodifiableCollection(zeilen);
  }

  public WahlverwaltungGebietInformation getStimmzettelgebiet() {
    return stimmzettelgebiet;
  }

  public Collection<WahlverwaltungGebietInformation> getWahlkreise() {
    return wahlkreise;
  }

  public Collection<WahlverwaltungGebietInformation> getStimmkreise() {
    return stimmkreise;
  }

  public Collection<WahlverwaltungGebietInformation> getWahlbereiche() {
    return wahlbereiche;
  }

  public Collection<WahlverwaltungGebietInformation> getBundeslaender() {
    return bundeslaender;
  }

  public Collection<WahlverwaltungGebietInformation> getKreise() {
    return kreise;
  }

  public Collection<WahlverwaltungGemeindeInformation> getGemeindeverbaende() {
    return gemeindeverbaende;
  }

  public Collection<WahlverwaltungGemeindeInformation> getGemeindenVerbandsfrei() {
    return gemeindenVerbandsfrei;
  }

  public Collection<WahlverwaltungGemeindeInformation> getGemeinden() {
    return gemeinden;
  }

  public Collection<WahlverwaltungGebietInformation> getStadtbezirke() {
    return stadtbezirke;
  }

  public Collection<WahlverwaltungGebietInformation> getOrtsbezirke() {
    return ortsbezirke;
  }

  public Collection<WahlverwaltungGebietInformation> getStadtteile() {
    return stadtteile;
  }

  public Collection<WahlverwaltungGebietInformation> getOrtsteile() {
    return ortsteile;
  }

  public Collection<ErgebnisZusammenstellungGruppe> getGruppen() {
    return gruppen;
  }

  public boolean isEmpty() {
    return getZeilen().isEmpty();
  }

  public Collection<ErgebnisZusammenstellungZeile> getZeilen() {
    return zeilen;
  }
}
