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

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

import de.ivu.elect.business.personenregister.entity.PersonenregisterPersonendaten;


import static java.util.Collections.emptyList;
import static java.util.Collections.singletonList;
import static java.util.Collections.unmodifiableList;

public class PersonenregisterSearchResult<T extends PersonenregisterPersonendaten> implements Serializable {

  private static final long serialVersionUID = 1L;

  private final UUID requestUUID; // Anfrage UUID (bei gecacheten Ergebnissen entspricht das nicht der UUID des Webservice-Aufrufs)

  private final UUID serviceUUID; // UUID die beim Aufruf des Webservice verwendet wurd

  private final List<T> personenregisterPersonendaten;

  private final AbstractPersonenregisterException exception;

  public PersonenregisterSearchResult(UUID requestUUID) {
    this(requestUUID, emptyList());
  }

  public PersonenregisterSearchResult(UUID requestUUID, T personenregisterPersonendaten) {
    this(requestUUID, singletonList(personenregisterPersonendaten));
  }

  public PersonenregisterSearchResult(UUID requestUUID, List<T> personenregisterPersonendaten) {
    this(requestUUID, requestUUID, personenregisterPersonendaten, null);
  }

  public PersonenregisterSearchResult(UUID requestUUID, AbstractPersonenregisterException exception) {
    this(requestUUID, requestUUID, emptyList(), exception);
  }

  public PersonenregisterSearchResult(UUID requestUUID, UUID serviceUUID, List<T> personenregisterPersonendaten, AbstractPersonenregisterException exception) {
    super();

    this.requestUUID = requestUUID;
    this.serviceUUID = serviceUUID;

    this.personenregisterPersonendaten = personenregisterPersonendaten;

    this.exception = exception;
  }

  public UUID getRequestUUID() {
    return requestUUID;
  }

  public boolean hasUniquePersonenregisterPersonendaten() {
    return getPersonenregisterPersonendaten().size() == 1;
  }

  public T getUniquePersonenregisterPersonendaten() {
    return getPersonenregisterPersonendaten().get(0);
  }

  public boolean hasPersonenregisterPersonendaten() {
    return !getPersonenregisterPersonendaten().isEmpty();
  }

  public List<T> getPersonenregisterPersonendaten() {
    return unmodifiableList(personenregisterPersonendaten);
  }

  public boolean hasSperrberechtigungFehltException() {
    return hasException() && getException() instanceof PersonenregisterSperrberechtigungFehltException;
  }

  public boolean hasException() {
    return getException() != null;
  }

  public AbstractPersonenregisterException getException() {
    return exception;
  }

  public boolean isCachedResult() {
    return !Objects.equals(serviceUUID, requestUUID);
  }
}
