package eu.dnetlib.openaire.db.objects;

import java.io.Serializable;
import java.sql.Date;

import javax.persistence.Column;
import javax.persistence.Embeddable;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.Table;

import org.apache.commons.lang.builder.HashCodeBuilder;

@Entity(name = "creations")
@Table(name = "creations")
public class Creation extends AbstractOpenaireObject {

	private static final long serialVersionUID = 2108113451001066587L;

	@Embeddable
	public class CreationId implements Serializable {
		/**
		 * 
		 */
		private static final long serialVersionUID = -1463232944191865637L;

		@ManyToOne
		@JoinColumn(name="creation", nullable=true)
		private Result creation;

		@ManyToOne
		@JoinColumn(name="user_email", nullable=true)
		private User user;

		public Result getCreation() {
			return creation;
		}

		public void setCreation(Result creation) {
			this.creation = creation;
		}

		public User getUser() {
			return user;
		}

		public void setUser(User user) {
			this.user = user;
		}

		@Override
		public boolean equals(Object o) {
			if (o != null || o instanceof CreationId) {
				CreationId cid = (CreationId) o;
				if (this.user.getEmail().equals(cid.getUser().getEmail()))
					if (this.creation.getResultID().equals(cid.getCreation().getResultID()))
						return true;
			} 
			return false;
		}

		@Override
		public int hashCode() {
			return new HashCodeBuilder()
			.appendSuper(super.hashCode())
			.append(this.user.getEmail())
			.append(this.creation.getResultID())
			.toHashCode();
		}
	}

	@Id
	private CreationId id;

	@Column(name="date_of_creation")
	private Date dateOfCreation;

	@Column(name="last_update_date")
	private Date lastUpdateDate;

	public CreationId getId() {
		return id;
	}

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

	public Date getDateOfCreation() {
		return dateOfCreation;
	}

	public void setDateOfCreation(Date dateOfCreation) {
		this.dateOfCreation = dateOfCreation;
	}

	public Date getLastUpdateDate() {
		return lastUpdateDate;
	}

	public void setLastUpdateDate(Date lastUpdateDate) {
		this.lastUpdateDate = lastUpdateDate;
	}

}
