package eu.dnetlib.goldoa.domain;

import com.google.gwt.user.client.rpc.IsSerializable;
import org.hibernate.annotations.CacheConcurrencyStrategy;

import javax.persistence.*;
import java.util.ArrayList;
import java.util.List;
import org.hibernate.annotations.Cache;


@Entity
@Table(name="\"user\"")
//@Cache(usage = CacheConcurrencyStrategy.READ_WRITE,region = "user")
public class User implements IsSerializable {
	private static final long serialVersionUID = 1L;

	@Id
	@Column(columnDefinition = "text",unique = true, nullable = false)
	private String email;
	@Column(columnDefinition = "text")
	private String firstname;
	@Column(columnDefinition = "text")
	private String lastname;
	@Column(columnDefinition = "text")
	private String initials;
	@Column(columnDefinition = "text")
	private String telephone;
	@Column(columnDefinition = "boolean default false")
	private boolean active;
	@Column(columnDefinition = "text")
	private String source;
	@Column(columnDefinition = "text")
	private String password;
	@Column(columnDefinition = "text")
	private String orcidid;
	@Column(columnDefinition = "text")
	private String id;


	@ManyToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL)
	@JoinTable(name = "user_affiliation",  joinColumns = {
			@JoinColumn(name = "\"user\"", nullable = false, updatable = false),
			},
			inverseJoinColumns = { @JoinColumn(name = "affiliation",
					nullable = false, updatable = false) })
	private List<Affiliation> affiliations = new ArrayList<>();

	@ManyToOne
	@JoinColumn(name = "publisher")
	private Publisher publisher;

	@OneToMany(mappedBy = "pk.user", cascade=CascadeType.ALL,fetch = FetchType.LAZY)
	private List<UserRole> roles = new ArrayList<>();

	@ManyToMany(fetch = FetchType.LAZY)
	@JoinTable(name = "project_coordinator",  joinColumns = {
			@JoinColumn(name ="\"user\"", nullable = false, updatable = false)},
			inverseJoinColumns = {@JoinColumn(name = "project",
					nullable = false, updatable = false) })
	private List<Project> coordinatedProjects = new ArrayList<>();

	public List<UserRole> getRoles() {
		return roles;
	}

	public void setRole(List<UserRole> roles) {
		this.roles = roles;
	}

	public void addUserRole(UserRole ur) {
		this.roles.add(ur);
	}

	public void removeUserRole(UserRole ur) {
		this.roles.remove(ur);
	}

	public void addUserAffiliation(Affiliation af){
		this.affiliations.add(af);
	}

	public void removeUserAffiliation(Affiliation af){
		this.affiliations.remove(af);
	}

	public User() {}

	public String getEmail() {
		return email;
	}

	public void setEmail(String email) {
		this.email = email;
	}

	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 getInitials() {
		return initials;
	}

	public void setInitials(String initials) {
		this.initials = initials;
	}

	public String getTelephone() {
		return telephone;
	}

	public void setTelephone(String telephone) {
		this.telephone = telephone;
	}

	public boolean isActive() {
		return active;
	}

	public void setActive(boolean active) {
		this.active = active;
	}

	public String getSource() {
		return source;
	}

	public void setSource(String source) {
		this.source = source;
	}

	public String getPassword() {
		return password;
	}

	public void setPassword(String password) {
		this.password = password;
	}

	public String getOrcidid() {
		return orcidid;
	}

	public void setOrcidid(String orcidid) {
		this.orcidid = orcidid;
	}

	public String getId() {
		return id;
	}

	public void setId(String id) {
		this.id = id;
	}

	public Publisher getPublisher() {
		return publisher;
	}

	public void setPublisher(Publisher publisher) {
		this.publisher = publisher;
	}

	public List<Affiliation> getAffiliations() {
		return affiliations;
	}

	public void setAffiliations(List<Affiliation> affiliations) {
		this.affiliations = affiliations;
	}

	public List<Project> getCoordinatedProjects() {
		return coordinatedProjects;
	}

	public void setCoordinatedProjects(List<Project> coordinatedProjects) {
		this.coordinatedProjects = coordinatedProjects;
	}

}
