package eu.dnetlib.openaire.db.objects;

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

import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.JoinTable;
import javax.persistence.ManyToMany;
import javax.persistence.ManyToOne;
import javax.persistence.Table;

@Entity(name = "projects")
@Table(name = "projects")
public class Project implements Serializable {

	/**
	 * 
	 */
	private static final long serialVersionUID = -5124327356779301705L;

	@Id
	@Column(name = "projectID")
	private String projectID;

	@Column(name="website")
	private String webSite;
	
	@Column(name="ec_project_website")
	private String ECProjectWebsite;
	
	@Column(name="grant_agreement_number")
	private String grantAgreementNumber;

	@Column(name="call_identifier")
	private String callIdentifier;
	
	@Column(name="acronym")
	private String acronym;

	@Column(name="title")
	private String title;
	
	@Column(name="start_date")
	private Date startDate;

	@Column(name="end_date")
	private Date endDate;

	@ManyToOne
	@JoinColumn(name = "fundedBy")
	private Subdivision fundedBy;
	
	@Column(name="sc39", nullable=false)
	private Boolean SC39 = false;
	
	@Column(name = "directorate_general", nullable=true)
	private String directorateGeneral;

	@Column(name = "research_theme_code", nullable=true)
	private String researchThemeCode ;
	
	@Column(name = "optional1", nullable=true)
	private String optional1;

	@Column(name = "optional2", nullable=true)
	private String optional2;
	
	@ManyToMany(cascade={CascadeType.PERSIST, CascadeType.MERGE})
	@JoinTable(
        name="results_projects",
        joinColumns=@JoinColumn(name="project"),
        inverseJoinColumns=@JoinColumn(name="result")
    )
	private Collection<Result> results;
	
	@ManyToMany(cascade={CascadeType.PERSIST, CascadeType.MERGE})
	@JoinTable(
	        name="participants_projects",
	        joinColumns=@JoinColumn(name="project"),
	        inverseJoinColumns=@JoinColumn(name="participant")
	    )
	private Collection<Participant> participants;

	@ManyToMany(cascade={CascadeType.PERSIST, CascadeType.MERGE})
	@JoinTable(
        name="projects_contracttypes",
        joinColumns=@JoinColumn(name="project"),
        inverseJoinColumns=@JoinColumn(name="contractType")
    )
	private Collection<ContractType> contractTypes;

	@ManyToMany(cascade={CascadeType.PERSIST, CascadeType.MERGE})
	@JoinTable(
        name="projects_projectsubjects",
        joinColumns=@JoinColumn(name="project"),
        inverseJoinColumns=@JoinColumn(name="project_subject")
    )
	private Collection<ProjectSubject> projectSubjects;

	public String getProjectID() {
		return projectID;
	}

	public void setProjectID(String projectID) {
		this.projectID = projectID;
	}

	public String getWebSite() {
		return webSite;
	}

	public void setWebSite(String webSite) {
		this.webSite = webSite;
	}

	public String getECProjectWebsite() {
		return ECProjectWebsite;
	}

	public void setECProjectWebsite(String eCProjectWebsite) {
		ECProjectWebsite = eCProjectWebsite;
	}

	public String getGrantAgreementNumber() {
		return grantAgreementNumber;
	}

	public void setGrantAgreementNumber(String grantAgreementNumber) {
		this.grantAgreementNumber = grantAgreementNumber;
	}

	public String getCallIdentifier() {
		return callIdentifier;
	}

	public void setCallIdentifier(String callIdentifier) {
		this.callIdentifier = callIdentifier;
	}

	public String getAcronym() {
		return acronym;
	}

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

	public String getTitle() {
		return title;
	}

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

	public Date getStartDate() {
		return startDate;
	}

	public void setStartDate(Date startDate) {
		this.startDate = startDate;
	}

	public Date getEndDate() {
		return endDate;
	}

	public void setEndDate(Date endDate) {
		this.endDate = endDate;
	}

	public Subdivision getFundedBy() {
		return fundedBy;
	}

	public void setFundedBy(Subdivision fundedBy) {
		this.fundedBy = fundedBy;
	}

	public String getOptional1() {
		return optional1;
	}

	public void setOptional1(String optional1) {
		this.optional1 = optional1;
	}

	public String getOptional2() {
		return optional2;
	}

	public void setOptional2(String optional2) {
		this.optional2 = optional2;
	}

	public Collection<Result> getResults() {
		return results;
	}

	public void setResults(Collection<Result> results) {
		this.results = results;
	}

	public Collection<Participant> getParticipants() {
		return participants;
	}

	public void setParticipants(Collection<Participant> participants) {
		this.participants = participants;
	}

	public Collection<ContractType> getContractTypes() {
		return contractTypes;
	}

	public void setContractTypes(Collection<ContractType> contractTypes) {
		this.contractTypes = contractTypes;
	}

	public Collection<ProjectSubject> getProjectSubjects() {
		return projectSubjects;
	}

	public void setProjectSubjects(Collection<ProjectSubject> projectSubjects) {
		this.projectSubjects = projectSubjects;
	}
	
	public void setSC39(Boolean sC39) {
		SC39 = sC39;
	}

	public Boolean getSC39() {
		return SC39;
	}

	public void setDirectorateGeneral(String directorateGeneral) {
		this.directorateGeneral = directorateGeneral;
	}

	public String getDirectorateGeneral() {
		return directorateGeneral;
	}

	public void setResearchThemeCode(String researchThemeCode) {
		this.researchThemeCode = researchThemeCode;
	}

	public String getResearchThemeCode() {
		return researchThemeCode;
	}
	
}
