package eu.dnetlib.domain.functionality;

import java.util.ArrayList;
import java.util.Date;
import java.util.HashSet;
import java.util.List;
import java.util.Set;

import eu.dnetlib.domain.SecureDriverResource;
import eu.dnetlib.domain.enabling.SecurityProfile;

/**
 * User's Profile class
 * 
 * @author <a href="mailto:kiatrop@di.uoa.gr">Katerina Iatropoulou</a>
 * 
 */

public class UserProfile extends SecureDriverResource {
	private static final long serialVersionUID = -1565597762736460041L;

	// security Profile
	private SecurityProfile securityProfile = new SecurityProfile();

	// general info
	private String email = null;
	private String firstname = null;
	private String lastname = null;

	private String institution = null;

	private boolean active = false;
	private String activationId = null;

	// recommendations
	private Set<String> recommendations = new HashSet<String>();
	private Boolean recommendationSendEmail = null;
	private Integer recommendationPeriod = null;
	private Date lastNotificationDate = null;

	// communities
	private Set<CommunityRegistration> communities = new HashSet<CommunityRegistration>();

	// queries
	private List<SavedQuery> savedQueries = new ArrayList<SavedQuery>();

	// search template
	private String cqlText = null;
	private List<String> collectionIds = new ArrayList<String>();
	private List<String> communityIds = new ArrayList<String>();

	/**
	 * The default constructor sets the resourceKind to
	 * <b>UserDSResourceType</b>, resourceType to <b>UserDSResources</b> and
	 * dateOfCreation to the current system date.
	 */
	public UserProfile() {
		this.setResourceKind("UserDSResources");
		this.setResourceType("UserDSResourceType");
		this.setDateOfCreation(new Date());
		recommendationSendEmail = Boolean.valueOf(false);
	}

	@Deprecated
	public String getUserId() {
		return this.getResourceId();
	}

	@Deprecated
	public void setUserId(String userId) {
		this.setResourceId(userId);
	}

	public String getActivationId() {
		return activationId;
	}

	public void setActivationId(String activationId) {
		this.activationId = activationId;
	}

	public String getEmail() {
		return email;
	}

	public void setEmail(String email) {
		this.email = email;
	}

	public String getPassword() {
		return securityProfile.getPassword();
	}

	public void setPassword(String password) {
		this.securityProfile.setPassword(password);
	}

	public String getFirstname() {
		return firstname;
	}

	public void setFirstname(String firstname) {
		this.firstname = firstname;
	}

	public String getLastname() {
		return lastname;
	}

	public void setLastname(String lastname) {
		this.lastname = lastname;
	}

	public String getInstitution() {
		return institution;
	}

	public void setInstitution(String institution) {
		this.institution = institution;
	}

	public Set<String> getRecommendations() {
		return recommendations;
	}

	public void setRecommendations(Set<String> recommendations) {
		this.recommendations = recommendations;
	}

	public Date getLastNotificationDate() {
		return this.lastNotificationDate;
	}

	public void setLastNotificationDate(Date lastNotificationDate) {
		this.lastNotificationDate = lastNotificationDate;
	}

	public Set<CommunityRegistration> getCommunities() {
		return communities;
	}

	public void setCommunities(Set<CommunityRegistration> communities) {
		this.communities = communities;
	}

	public Date getRegistrationDate() {
		return this.getDateOfCreation();
	}

	public void setRegistrationDate(Date registrationDate) {
		this.setDateOfCreation(registrationDate);
	}

	public Integer getRecommendationPeriod() {
		return recommendationPeriod;
	}

	public List<String> getRoles() {
		/*
		 * Set<String> set = new HashSet<String>(); for(String
		 * ids:this.securityProfile.getIdentities()) set.add(ids);
		 */
		return this.securityProfile.getIdentities();
	}

	public void setRoles(List<String> roles) {
		this.securityProfile.getIdentities().clear();
		// this.securityProfile.getIdentities().addAll(roles);
		for (String role : roles) {
			if (!this.securityProfile.getIdentities().contains(role))
				this.securityProfile.getIdentities().add(role);
		}
	}

	public List<SavedQuery> getSavedQueries() {
		return savedQueries;
	}

	public void setSavedQueries(List<SavedQuery> savedQueries) {
		this.savedQueries = savedQueries;
	}

	public boolean getActive() {
		return active;
	}

	public void setActive(boolean active) {
		this.active = active;
	}

	public Boolean getRecommendationSendEmail() {
		if (recommendationSendEmail == null) {
			recommendationSendEmail = Boolean.valueOf(true);
		}
		return recommendationSendEmail;
	}

	public void setRecommendationSendEmail(Boolean recommendationSendEmail) {
		this.recommendationSendEmail = recommendationSendEmail;
	}

	public void setRecommendationPeriod(Integer recommendationPeriod) {
		this.recommendationPeriod = recommendationPeriod;
	}

	public boolean hasSecurityProfile() {
		return true;
	}

	public SecurityProfile getSecurityProfile() {
		return securityProfile;
	}

	public void setSecurityProfile(SecurityProfile securityProfile) {
		this.securityProfile = securityProfile;
	}

	public String toString() {
		return this.getEmail();
	}

	public boolean getIsCollectionManager() {
		return (this.getRoles().contains("collectionManager") || this
				.getIsSuperUser());
	}

	public void setIsCollectionManager(boolean tonPoulo) {
		// nothing
	}

	public boolean getIsCommunityManager() {
		return (this.getRoles().contains("communityManager") || this
				.getIsSuperUser());
	}

	public void setIsCommunityManager(boolean tonPoulo) {
		// nothing
	}

	public boolean getIsUserManager() {
		return (this.getRoles().contains("userManager") || this
				.getIsSuperUser());
	}

	public void setIsUserManager(boolean value) {
		// nothing
	}

	public boolean getIsSuperUser() {
		return this.getRoles().contains("superUser");
	}

	public void setIsSuperUser(boolean tonPoulo) {
		// nothing
	}

	public List<String> getCollectionIds() {
		return (collectionIds == null) ? new ArrayList<String>()
				: collectionIds;
	}

	public void setCollectionIds(List<String> collectionIds) {
		this.collectionIds = collectionIds;
	}

	public List<String> getCommunityIds() {
		return (communityIds == null) ? new ArrayList<String>() : communityIds;
	}

	public void setCommunityIds(List<String> communityIds) {
		this.communityIds = communityIds;
	}

	public String getCqlText() {
		return cqlText;
	}

	public void setCqlText(String cqlText) {
		this.cqlText = cqlText;
	}
}