package eu.dnetlib.goldoa.domain;

import com.fasterxml.jackson.annotation.JsonBackReference;
import com.google.gwt.user.client.rpc.IsSerializable;

import javax.persistence.*;
import java.sql.Timestamp;
import java.util.ArrayList;
import java.util.List;


/**
 * The persistent class for the project database table.
 * 
 */
@Entity
public class Project implements IsSerializable {
	private static final long serialVersionUID = 1L;
	@Id
	@Column(columnDefinition = "text")
	private String id;
	@Column(columnDefinition = "text")
	private String acronym;
	@Column(columnDefinition = "text")
	private String title;
	@Column(columnDefinition = "text")
	private String funder;
	@Column(columnDefinition = "text")
	private String fundingstream;
	@Column(columnDefinition = "text")
	private String scientificarea;
	@Column(columnDefinition = "text")
	private String call;
	@Column(columnDefinition = "text",name = "\"grant\"")
	private String grant;
	private Timestamp startdate;
	private Timestamp enddate;
	private Boolean sc39;
	@Column(columnDefinition = "text")
	private String url;
	@Column(columnDefinition = "text", nullable=false)
	private String source;

	@Transient
	private int remainingPublications;


	@ManyToMany(fetch = FetchType.LAZY, mappedBy = "coordinatedProjects")
	@JsonBackReference(value = "coordinators")
	private List<User> coordinators = new ArrayList<>();

	@ManyToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL)
	@JoinTable(name = "project_organization",  joinColumns = {
			@JoinColumn(name = "project", nullable = false, updatable = false)},
			inverseJoinColumns = { @JoinColumn(name = "organization",
					nullable = false, updatable = false) })
	@JsonBackReference(value ="organizations")
	private List<Organization> organizations = new ArrayList<>();


	public Project() {
	}

	public String getAcronym() {
		return this.acronym;
	}

	public void setAcronym(String acronym) {
		this.acronym = acronym;
	}

	public String getCall() {
		return this.call;
	}

	public void setCall(String call) {
		this.call = call;
	}

	public Timestamp getEnddate() {
		return this.enddate;
	}

	public void setEnddate(Timestamp enddate) {
		this.enddate = enddate;
	}

	public String getFunder() {
		return this.funder;
	}

	public void setFunder(String funder) {
		this.funder = funder;
	}

	public String getFundingstream() {
		return this.fundingstream;
	}

	public void setFundingstream(String fundingstream) {
		this.fundingstream = fundingstream;
	}

	public String getGrant() {
		return this.grant;
	}

	public void setGrant(String gr) {
		this.grant = gr;
	}

	public String getId() {
		return this.id;
	}

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

	public Boolean getSc39() {
		return this.sc39;
	}

	public void setSc39(Boolean sc39) {
		this.sc39 = sc39;
	}

	public String getScientificarea() {
		return this.scientificarea;
	}

	public void setScientificarea(String scientificarea) {
		this.scientificarea = scientificarea;
	}

	public String getSource() {
		return this.source;
	}

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

	public Timestamp getStartdate() {
		return this.startdate;
	}

	public void setStartdate(Timestamp startdate) {
		this.startdate = startdate;
	}

	public String getTitle() {
		return this.title;
	}

	public void setTitle(String title) {
		this.title = title;
	}

	public String getUrl() {
		return this.url;
	}

	public void setUrl(String url) {
		this.url = url;
	}

	public List<User> getCoordinators() {
		return coordinators;
	}

	public void setCoordinators(List<User> coordinators) {
		this.coordinators = coordinators;
	}

	public List<Organization> getOrganizations() {
		return organizations;
	}

	public void setOrganizations(List<Organization> organizations) {
		this.organizations = organizations;
	}

	public void setRemainingPublications(int remainingPublications) {
		this.remainingPublications = remainingPublications;
	}

	public int getRemainingPublications() {
		return this.remainingPublications;
	}

}