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

import static org.apache.commons.lang3.StringUtils.containsIgnoreCase;

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

public class NlGebiet {

  private static final Boolean WAHL_UNTERSTUETZER_ERFASSBAR_VALUE_BRIEFWAHL_GEMEINDE_UNZULAESSIG = Boolean.TRUE;

  // Bei Anpassungen auch NlWasGebietViewFormBuilder#addGebietsartProperty anpassen...
  private static final Boolean GEBIET_SONDERSTIMMBEZIRK_VALUE_BRIEFWAHLGEBIET_AUSLAND = Boolean.TRUE;

  private final Gebiet gebiet;

  public NlGebiet(Gebiet gebiet) {
    super();

    this.gebiet = gebiet;
  }

  private Wahl getWahl() {
    if (gebiet != null) {
      return gebiet.getWahl();
    }

    return null;
  }

  public boolean isBriefwahlGemeindeInGebietshierarchieUnterhalbZulaessig() {
    Wahl wahl = getWahl();

    return wahl != null && !WAHL_UNTERSTUETZER_ERFASSBAR_VALUE_BRIEFWAHL_GEMEINDE_UNZULAESSIG.equals(wahl.getUnterstuetzerErfassbar());
  }

  public void setBriefwahlGemeindeInGebietshierarchieUnterhalbZulaessig() {
    Wahl wahl = getWahl();

    if (wahl != null) {
      wahl.setUnterstuetzerErfassbar(!WAHL_UNTERSTUETZER_ERFASSBAR_VALUE_BRIEFWAHL_GEMEINDE_UNZULAESSIG);
    }
  }

  public void setBriefwahlGemeindeInGebietshierarchieUnterhalbUnzulaessig() {
    Wahl wahl = getWahl();

    if (wahl != null) {
      wahl.setUnterstuetzerErfassbar(WAHL_UNTERSTUETZER_ERFASSBAR_VALUE_BRIEFWAHL_GEMEINDE_UNZULAESSIG);
    }
  }

  public boolean isUrnenwahlgebietGemeinde() {
    return isUrnenwahlgebietGemeinde(gebiet);
  }

  public boolean isBriefwahlgebietGemeinde() {
    return isBriefwahlgebietGemeinde(gebiet);
  }

  public void setBriefwahlgebietGemeinde() {
    gebiet.setSonderstimmbezirk(!GEBIET_SONDERSTIMMBEZIRK_VALUE_BRIEFWAHLGEBIET_AUSLAND);
  }

  public boolean isBriefwahlAuslandInGebietshierarchieUnterhalbZulaessig() {
    return gebiet != null && (containsIgnoreCase(gebiet.getName(), "Gravenhage") || containsIgnoreCase(gebiet.getName(), "Den Haag"));
  }

  public boolean isBriefwahlgebietAusland() {
    return isBriefwahlgebietAusland(gebiet);
  }

  public void setBriefwahlgebietAusland() {
    gebiet.setSonderstimmbezirk(GEBIET_SONDERSTIMMBEZIRK_VALUE_BRIEFWAHLGEBIET_AUSLAND);
  }

  public static boolean isUrnenwahlgebietGemeinde(Gebiet gebiet) {
    return isUrnenwahlgebiet(gebiet);
  }

  public static boolean isBriefwahlgebietGemeinde(Gebiet gebiet) {
    return isBriefwahlgebiet(gebiet) && !GEBIET_SONDERSTIMMBEZIRK_VALUE_BRIEFWAHLGEBIET_AUSLAND.equals(gebiet.getSonderstimmbezirk());
  }

  public static boolean isBriefwahlgebietAusland(Gebiet gebiet) {
    return isBriefwahlgebiet(gebiet) && !isBriefwahlgebietGemeinde(gebiet);
  }

  private static boolean isUrnenwahlgebiet(Gebiet gebiet) {
    return gebiet != null && gebiet.isUrnenwahlgebiet();
  }

  private static boolean isBriefwahlgebiet(Gebiet gebiet) {
    return gebiet != null && gebiet.isBriefwahlgebiet();
  }

  public static boolean isListenwahlgebietenUebergeordnetesGebiet(Gebiet gebiet) {
    if (gebiet == null) {
      return false;
    }

    if (gebiet.isListenwahlgebiet()) {
      return false;
    }

    if (gebiet.hasUebergeordnetesGebiet()) {
      return isListenwahlgebietenUebergeordnetesGebiet(gebiet.getUebergeordnetesGebiet());
    }

    return true;
  }
}
