
package de.ivu.elect.presentation.personenregister;

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

import java.io.Serializable;
import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.UUID;

import de.ivu.elect.business.person.entity.Geschlecht;
import de.ivu.elect.business.security.entity.EntityMitSperrmerkmal;
import de.ivu.elect.jee.entity.Entity;
import de.ivu.elect.jee.entity.EntityContainer;
import de.ivu.elect.jee.entity.EntityFachlichAbhaengigNode;
import de.ivu.elect.jee.entity.EntityLongPK;
import de.ivu.elect.jee.entity.tk.EntityTK;
import de.ivu.elect.jee.entity.tk.EntityUK;
import de.ivu.elect.jee.protokollierung.AttributWertVorher;
import de.ivu.elect.jee.protokollierung.VorherNachherWert;

public abstract class AbstractEntityMitPersonendatenSearchResultEntry implements Entity<EntityLongPK, EntityUK>, EntityMitSperrmerkmal, Serializable {

  private static final long serialVersionUID = 1L;

  private final UUID uuid;

  public AbstractEntityMitPersonendatenSearchResultEntry() {
    super();

    // NOTE, dass jede 'Zeile' eine eigene UUID braucht und diese demnach nicht von der Personenregister-Person übernommen werden darf!
    this.uuid = UUID.randomUUID();
  }

  public UUID getUuid() {
    return uuid;
  }

  public abstract String getOrdnungsmerkmal();

  public abstract String getFamilienname();

  public abstract String getRufname();

  public abstract String getVornamen();

  public abstract Date getGeburtsdatum();

  public abstract Geschlecht getGeschlecht();

  public abstract String getAnschriftOrt();

  public abstract String getAnschriftStrassenname();

  public abstract String getAnschriftHausnummer();

  public abstract String getAnschriftBuchstabe();

  public abstract String getAnschriftZusatz();

  public String getAnschriftFormatted() {
    StringBuilder result = new StringBuilder();

    if (isNotBlank(getAnschriftStrassenname())) {
      result.append(getAnschriftStrassenname());
      result.append(" ");
    }

    if (isNotBlank(getAnschriftHausnummer())) {
      result.append(getAnschriftHausnummer());
    }

    if (isNotBlank(getAnschriftBuchstabe())) {
      result.append(getAnschriftBuchstabe());
    }

    if (isNotBlank(getAnschriftZusatz())) {
      result.append(" ");
      result.append(getAnschriftZusatz());
    }

    return result.toString().trim();
  }

  @Override
  public Long getId() {
    // ELECT-5245
    return null;
  }

  @Override
  public boolean isAenderungenProtokollieren() {
    return false;
  }

  @Override
  public Class< ? > getEntityClass() {
    throw new UnsupportedOperationException();
  }

  @Override
  public String getEntityTechnicalName() {
    throw new UnsupportedOperationException();
  }

  @Override
  public EntityLongPK getPk() {
    throw new UnsupportedOperationException();
  }

  @Override
  public EntityUK getUk() {
    throw new UnsupportedOperationException();
  }

  @Override
  public EntityTK getTk() {
    throw new UnsupportedOperationException();
  }

  @Override
  public Map<String, VorherNachherWert> getProtokollierteAttributeMitWerten() {
    throw new UnsupportedOperationException();
  }

  @Override
  public void setProtokollierteAttributeMitWerten(Map<String, AttributWertVorher> werteVorher) {
    throw new UnsupportedOperationException();
  }

  @Override
  public void resetProtokollierteAttribute() {
    throw new UnsupportedOperationException();
  }

  @Override
  public List<EntityFachlichAbhaengigNode> getFachlichAbhaengigeEntitaeten() {
    throw new UnsupportedOperationException();
  }

  @Override
  public boolean isInstanceOf(Class< ? > clazz) {
    return clazz.isInstance(this);
  }

  @Override
  public EntityContainer<AbstractEntityMitPersonendatenSearchResultEntry> castTo(Class clazz) {
    return new EntityContainer<>(this);
  }

  @Override
  public String getBaseClassName() {
    return getClass().getName();
  }

  @Override
  public void copyEntityAttributesToOtherEntity(Entity other) {
    throw new UnsupportedOperationException();
  }
}
