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

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

import java.io.Serializable;
import java.util.Objects;
import java.util.UUID;

import de.ivu.elect.business.anschrift.entity.AnschriftArt;

public class PersonenregisterAnschrift implements Serializable {

  private static final long serialVersionUID = 1L;

  private final UUID uuid;

  private final AnschriftArt anschriftArt;

  private final String strasse;

  private final String hausnummer;

  private final String hausnummerzusatz;

  private final String wohnungsnummer;

  private final String plz;

  private final String ort;

  private final String ortsteil;

  private final String staat;

  private final String zustellanweisung;

  private final String stimmbezirkSchluessel;

  private PersonenregisterAnschriftProperties personenregisterAnschriftProperties;

  public PersonenregisterAnschrift(AnschriftArt anschriftArt) {
    this(anschriftArt, "", "", "", "", "", "", "", "", "", "");
  }

  public PersonenregisterAnschrift(AnschriftArt anschriftArt, String strasse, String hausnummer, String hausnummerzusatz, String wohnungsnummer, String plz, String ort, String ortsteil, String staat,
      String zustellanweisung, String stimmbezirkSchluessel) {
    this.uuid = UUID.randomUUID();

    this.anschriftArt = anschriftArt;

    this.strasse = strasse;
    this.hausnummer = getHausnummerNormalized(hausnummer);
    this.hausnummerzusatz = hausnummerzusatz;
    this.wohnungsnummer = wohnungsnummer;

    this.plz = plz;
    this.ort = ort;
    this.ortsteil = ortsteil;

    this.staat = staat;

    this.zustellanweisung = zustellanweisung;

    this.stimmbezirkSchluessel = stimmbezirkSchluessel;
  }

  private static String getHausnummerNormalized(String value) {
    if (isNotBlank(value)) {
      // NOTE ELECT-2088, dass führende Nullen nicht überprüft/übernommen werden!
      return value.replaceFirst("^0+(?!$)", "");
    }

    return value;
  }

  /**
   * NOTE ELECT-2248, dass diese ID kein fachlicher Wert ist. Diese ist (im Gegensatz zu den anderen Attributen allerdings) immer gesetzt und eineindeutig, kann daher bswp. als <code>rowKey</code>
   * Attribut in einer {@link org.primefaces.component.datatable.DataTable} verwendet werden.
   *
   * @return The uuid.
   */
  public UUID getUuid() {
    return uuid;
  }

  public boolean isAnschriftArtUnbekannt() {
    return hasAnschriftArt(AnschriftArt.UNBEKANNT);
  }

  public boolean hasAnschriftArt(AnschriftArt anschriftArt) {
    return Objects.equals(getAnschriftArt(), anschriftArt);
  }

  public AnschriftArt getAnschriftArt() {
    return anschriftArt;
  }

  public String getStrasse() {
    return strasse;
  }

  public String getHausnummer() {
    return hausnummer;
  }

  public String getHausnummerzusatz() {
    return hausnummerzusatz;
  }

  public String getWohnungsnummer() {
    return wohnungsnummer;
  }

  public String getPlz() {
    return plz;
  }

  public String getOrt() {
    return ort;
  }

  public String getOrtsteil() {
    return ortsteil;
  }

  public String getStaat() {
    return staat;
  }

  public String getZustellanweisung() {
    return zustellanweisung;
  }

  public String getStimmbezirkSchluessel() {
    return stimmbezirkSchluessel;
  }

  public PersonenregisterAnschriftProperties getProperties() {
    if (personenregisterAnschriftProperties == null) {
      personenregisterAnschriftProperties = createProperties();
    }

    return personenregisterAnschriftProperties;
  }

  protected PersonenregisterAnschriftProperties createProperties() {
    return new PersonenregisterAnschriftProperties(this);
  }
}
