package com.belladati.sdk.user.impl;
import java.util.Date;
import java.util.HashSet;
import java.util.Set;
import com.belladati.sdk.impl.BellaDatiServiceImpl;
import com.belladati.sdk.user.User;
import com.belladati.sdk.user.UserGroup;
import com.belladati.sdk.user.UserRequestType;
import com.belladati.sdk.user.UserRole;
import com.belladati.sdk.util.impl.BellaDatiSdkUtils;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.node.ArrayNode;
public class UserImpl implements User {
private final BellaDatiServiceImpl service;
private final String id;
private final String username;
private final String givenName;
private final String familyName;
private final String email;
private final Date firstLogin;
private final Date lastLogin;
private final String timeZone;
private final String locale;
private final boolean active;
private final String domainId;
private final Set<UserRole> userRoles;
private final Set<UserGroup> userGroups;
public UserImpl(BellaDatiServiceImpl service, JsonNode json) {
this.service = service;
this.id = json.get("id").asText();
this.username = json.get("username").asText();
this.givenName = getStringOrEmpty(json, "name");
this.familyName = getStringOrEmpty(json, "surname");
this.email = getStringOrEmpty(json, "email");
this.firstLogin = parseDate(json, "firstLogin");
this.lastLogin = parseDate(json, "lastLogin");
this.timeZone = getStringOrEmpty(json, "timeZone");
this.locale = getStringOrEmpty(json, "locale");
this.active = getBooleanOrDefault(json, "active", false);
this.domainId = getStringOrEmpty(json, "domain_id");
this.userRoles = new HashSet<UserRole>();
if (json.hasNonNull("roles")) {
ArrayNode nodes = (ArrayNode) json.get("roles");
for (JsonNode node : nodes) {
this.userRoles.add(UserRole.valueOfJson(node.get("role").asText()));
}
}
this.userGroups = new HashSet<UserGroup>();
if (json.hasNonNull("groups")) {
ArrayNode nodes = (ArrayNode) json.get("groups");
for (JsonNode node : nodes) {
this.userGroups.add(new UserGroupImpl(node));
}
}
}
private Date parseDate(JsonNode json, String field) {
if (json.hasNonNull(field)) {
return BellaDatiSdkUtils.parseJavaUtilDate(json.get(field).asText());
}
return null;
}
@Override
public String getId() {
return id;
}
@Override
public String getName() {
if (givenName.isEmpty() || familyName.isEmpty()) {
// no need for separating space since at least one of them is empty
return givenName + familyName;
}
return givenName + " " + familyName;
}
@Override
public String getUsername() {
return username;
}
@Override
public String getGivenName() {
return givenName;
}
@Override
public String getFamilyName() {
return familyName;
}
@Override
public String getEmail() {
return email;
}
@Override
public Date getFirstLogin() {
return firstLogin != null ? (Date) firstLogin.clone() : null;
}
@Override
public Date getLastLogin() {
return lastLogin != null ? (Date) lastLogin.clone() : null;
}
@Override
public String getTimeZone() {
return timeZone;
}
@Override
public String getLocale() {
return locale;
}
@Override
public boolean getActive() {
return active;
}
@Override
public String getDomainId() {
return domainId;
}
@Override
public Set<UserRole> getUserRoles() {
return userRoles;
}
@Override
public Set<UserGroup> getUserGroups() {
return userGroups;
}
@Override
public String toString() {
String name = getName();
if (name == null || name.isEmpty()) {
return username;
}
return name;
}
@Override
public boolean equals(Object obj) {
if (obj instanceof UserImpl) {
return id.equals(((UserImpl) obj).id);
}
return false;
}
@Override
public int hashCode() {
return id.hashCode();
}
@Override
public String loadStatus() {
return service.loadUserStatus(id);
}
@Override
public void postStatus(String status) {
service.postUserStatus(id, status);
}
@Override
public String createUserRequest(UserRequestType requestType) {
return service.createUserRequest(username, requestType);
}
@Override
public String createAccessToken(Integer validity, String domainId) {
return service.createAccessToken(username, validity, domainId);
}
}