
package de.ivu.elect.business.gebietsbaum.boundary;

import static java.util.Objects.requireNonNull;

import de.ivu.elect.business.gebietsbaum.entity.Gebiet;
import de.ivu.elect.business.wahl.entity.Wahl;

public class WahlverwaltungGebietDescriptor {

  private final Wahl wahl;

  private final Gebiet gebiet;

  private final WahlverwaltungGebietInformation wahlkreis;

  private final WahlverwaltungGebietInformation stimmkreis;

  private final WahlverwaltungGebietInformation wahlbereich;

  private final WahlverwaltungGebietInformation stimmzettelgebiet;

  private final WahlverwaltungGebietInformation erfassungsgebiet;

  private final WahlverwaltungGebietInformation briefwahlgebiet;

  private final WahlverwaltungGebietInformation bundesland;

  private final WahlverwaltungGebietInformation kreis;

  private final WahlverwaltungGebietInformation gemeindeverwaltung;

  private final WahlverwaltungGemeindeInformation gemeindeverband;

  private final WahlverwaltungGemeindeInformation gemeinde;

  private final WahlverwaltungGebietInformation stadtbezirk;

  private final WahlverwaltungGebietInformation ortsbezirk;

  private final WahlverwaltungGebietInformation stadtteil;

  private final WahlverwaltungGebietInformation ortsteil;

  public WahlverwaltungGebietDescriptor(Gebiet gebiet, WahlverwaltungGebietInformation wahlkreis, WahlverwaltungGebietInformation stimmkreis, WahlverwaltungGebietInformation wahlbereich,
      WahlverwaltungGebietInformation stimmzettelgebiet, WahlverwaltungGebietInformation erfassungsgebiet, WahlverwaltungGebietInformation briefwahlgebiet, WahlverwaltungGebietInformation bundesland,
      WahlverwaltungGebietInformation kreis, WahlverwaltungGebietInformation gemeindeverwaltung, WahlverwaltungGemeindeInformation gemeindeverband, WahlverwaltungGemeindeInformation gemeinde,
      WahlverwaltungGebietInformation ortsbezirk, WahlverwaltungGebietInformation stadtbezirk, WahlverwaltungGebietInformation ortsteil, WahlverwaltungGebietInformation stadtteil) {
    super();

    requireNonNull(gebiet, "Gebiet darf nicht null sein!");

    this.wahl = gebiet.getWahl();

    requireNonNull(this.wahl, "Wahl darf nicht null sein!");

    this.gebiet = gebiet;

    this.wahlkreis = wahlkreis;
    this.stimmkreis = stimmkreis;
    this.wahlbereich = wahlbereich;

    this.stimmzettelgebiet = stimmzettelgebiet;
    this.erfassungsgebiet = erfassungsgebiet;
    this.briefwahlgebiet = briefwahlgebiet;

    this.bundesland = bundesland;
    this.kreis = kreis;
    this.gemeindeverwaltung = gemeindeverwaltung;
    this.gemeindeverband = gemeindeverband;
    this.gemeinde = gemeinde;
    this.stadtbezirk = stadtbezirk;
    this.ortsbezirk = ortsbezirk;
    this.stadtteil = stadtteil;
    this.ortsteil = ortsteil;
  }

  public Gebiet getGebiet() {
    return gebiet;
  }

  public Wahl getWahl() {
    return wahl;
  }

  public WahlverwaltungGebietInformation getWahlkreis() {
    return wahlkreis;
  }

  public WahlverwaltungGebietInformation getStimmkreis() {
    return stimmkreis;
  }

  public WahlverwaltungGebietInformation getWahlbereich() {
    return wahlbereich;
  }

  public WahlverwaltungGebietInformation getStimmzettelgebiet() {
    return stimmzettelgebiet;
  }

  public WahlverwaltungGebietInformation getErfassungsgebiet() {
    return erfassungsgebiet;
  }

  /**
   * Der Briefwahlbezirk, dem das Gebiet zugeordnet ist...
   */
  public WahlverwaltungGebietInformation getBriefwahlgebiet() {
    return briefwahlgebiet;
  }

  public WahlverwaltungGebietInformation getBundesland() {
    return bundesland;
  }

  /**
   * Landkreis/Kreisfreie Stadt
   */
  public WahlverwaltungGebietInformation getKreis() {
    return kreis;
  }

  /**
   * A.k.a. "Gebiet zur Verwaltung von Gemeinden (und Gemeindeverbänden) OHNE Ergebnisrelevanz", bspw. Verwaltungsgemeinschaft (KOM-NI), Verbandsgemeinde (KOM-BY, SPEZIALFALL/AUSNAHME!!!)
   *
   * @see ELECT-16520
   */
  public WahlverwaltungGebietInformation getGemeindeverwaltung() {
    return gemeindeverwaltung;
  }

  /**
   * A.k.a. "Gebiet zur Verwaltung von (Mitglieds-) Gemeinden MIT Ergebnisrelevanz", bspw. Samtgemeinde (KOM-NI), Amt (KOM-NI, KOM-SH, KOM-BB)
   */
  public WahlverwaltungGemeindeInformation getGemeindeverband() {
    return gemeindeverband;
  }

  public WahlverwaltungGemeindeInformation getGemeinde() {
    return gemeinde;
  }

  public WahlverwaltungGebietInformation getStadtbezirk() {
    return stadtbezirk;
  }

  public WahlverwaltungGebietInformation getOrtsbezirk() {
    return ortsbezirk;
  }

  public WahlverwaltungGebietInformation getStadtteil() {
    return stadtteil;
  }

  public WahlverwaltungGebietInformation getOrtsteil() {
    return ortsteil;
  }
}
