
package de.ivu.elect.was.exchange.gebietsbaum.wahlberechtigte.vois;

import static org.apache.commons.lang3.StringUtils.substringAfter;
import static org.apache.commons.lang3.StringUtils.substringBefore;
import static org.apache.commons.lang3.StringUtils.trimToEmpty;

import org.jsefa.csv.annotation.CsvDataType;
import org.jsefa.csv.annotation.CsvField;

import de.ivu.jsefa.CsvHeader;

@CsvDataType // ELECTKOM-158
public class AnzahlWahlberechtigteMesoVoisCsvDTO {

  private static final String GEBIET_NUMMER_NAME_SEPARATOR = ":";

  private static final String GEBIET_NUMMER_GESAMT = "Gesamt";

  @CsvField(pos = 1)
  @CsvHeader("Wahlbezirk")
  private String gebietNummerName;

  @CsvField(pos = 2)
  @CsvHeader("GES") // Personen im Verzeichnis (= (Personen mit Sperrvermerk 'G' oder 'N') + (Wahl-/Stimmberechtigte Personen (A1 + A2)))
  private Long anzahlPersonenGesamt;

  @CsvField(pos = 3)
  @CsvHeader("STR") // Personen mit Sperrvermerk 'G' oder 'N' (a.k.a. NICHT Wahl-/Stimmberechtigte Personen!!!)
  private Long anzahlPersonenNichtWahlberechtigt;

  @CsvField(pos = 4)
  @CsvHeader("STB") // Wahl-/Stimmberechtigte Personen (A1 + A2)
  private Long anzahlWahlberechtigteOhneWahlscheinPlusAnzahlWahlberechtigteMitWahlschein;

  @CsvField(pos = 5)
  @CsvHeader("MSP") // Wahl-/Stimmberechtigte Personen mit Sperrvermerk (A2)
  private Long anzahlWahlberechtigteMitWahlschein;

  @CsvField(pos = 6)
  @CsvHeader("OSP") // Wahl-/Stimmberechtigte Personen ohne Sperrvermerk (A1)
  private Long anzahlWahlberechtigteOhneWahlschein;

  public AnzahlWahlberechtigteMesoVoisCsvDTO() {
    super();
  }

  public boolean hasGebietNummerStimmbezirk() {
    return !hasGebietNummerGesamt();
  }

  public boolean hasGebietNummerGesamt() {
    return GEBIET_NUMMER_GESAMT.equalsIgnoreCase(getGebietNummer());
  }

  public String getGebietNummer() {
    return getGebietNummerNameSplitted()[0];
  }

  public String getGebietName() {
    return getGebietNummerNameSplitted()[1];
  }

  private String[] getGebietNummerNameSplitted() {
    String value = trimToEmpty(getGebietNummerName());

    return new String[] { //
        trimToEmpty(substringBefore(value, GEBIET_NUMMER_NAME_SEPARATOR)), //
        trimToEmpty(substringAfter(value, GEBIET_NUMMER_NAME_SEPARATOR)) //
    };
  }

  public String getGebietNummerName() {
    return gebietNummerName;
  }

  public void setGebietNummerName(String gebietNummerName) {
    this.gebietNummerName = gebietNummerName;
  }

  public Long getAnzahlPersonenGesamt() {
    return anzahlPersonenGesamt;
  }

  public void setAnzahlPersonenGesamt(Long anzahlPersonenGesamt) {
    this.anzahlPersonenGesamt = anzahlPersonenGesamt;
  }

  public Long getAnzahlPersonenNichtWahlberechtigt() {
    return anzahlPersonenNichtWahlberechtigt;
  }

  public void setAnzahlPersonenNichtWahlberechtigt(Long anzahlPersonenNichtWahlberechtigt) {
    this.anzahlPersonenNichtWahlberechtigt = anzahlPersonenNichtWahlberechtigt;
  }

  public Long getAnzahlWahlberechtigteOhneWahlscheinPlusAnzahlWahlberechtigteMitWahlschein() {
    return anzahlWahlberechtigteOhneWahlscheinPlusAnzahlWahlberechtigteMitWahlschein;
  }

  public void setAnzahlWahlberechtigteOhneWahlscheinPlusAnzahlWahlberechtigteMitWahlschein(Long anzahlWahlberechtigteOhneWahlscheinPlusAnzahlWahlberechtigteMitWahlschein) {
    this.anzahlWahlberechtigteOhneWahlscheinPlusAnzahlWahlberechtigteMitWahlschein = anzahlWahlberechtigteOhneWahlscheinPlusAnzahlWahlberechtigteMitWahlschein;
  }

  public Long getAnzahlWahlberechtigteMitWahlschein() {
    return anzahlWahlberechtigteMitWahlschein;
  }

  public void setAnzahlWahlberechtigteMitWahlschein(Long anzahlWahlberechtigteMitWahlschein) {
    this.anzahlWahlberechtigteMitWahlschein = anzahlWahlberechtigteMitWahlschein;
  }

  public Long getAnzahlWahlberechtigteOhneWahlschein() {
    return anzahlWahlberechtigteOhneWahlschein;
  }

  public void setAnzahlWahlberechtigteOhneWahlschein(Long anzahlWahlberechtigteOhneWahlschein) {
    this.anzahlWahlberechtigteOhneWahlschein = anzahlWahlberechtigteOhneWahlschein;
  }

  public Long getAnzahlWahlberechtigteNichtImWaehlerverzeichnis() {
    return 0L; // ELECT-8647
  }
}
