package eu.dnetlib.goldoa.domain;

import com.google.gwt.user.client.rpc.IsSerializable;

import javax.persistence.*;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;


/**
 * The persistent class for the publication database table.
 * 
 */
@Entity
@Table(name = "publication")
public class Publication implements IsSerializable {
	private static final long serialVersionUID = 1L;


	@Id
	@Column(columnDefinition = "text")
	private String id;
	@Temporal(TemporalType.DATE)
	private Date acceptancedate;
	@Column(columnDefinition = "text")
	private String alternativedoi;
	@Column(columnDefinition = "text")
	private String alternativetitle;
	@Temporal(TemporalType.DATE)
	private Date date;
	@Column(columnDefinition = "text")
	private String doi;
	@Column(columnDefinition = "text")
	private String eventdetails;
	@Column(columnDefinition = "text")
	private String repository;
	@Column(columnDefinition = "text")
	private String source;
	@Column(columnDefinition = "text")
	private String subjects;
	@Column(columnDefinition = "text")
	private String title;
	@Column(columnDefinition = "text")
	private String languages;
	@Column(columnDefinition = "text")
	private String license;


	@ManyToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL)
	@JoinTable(name = "publication_author",  joinColumns = {
			@JoinColumn(name = "publication", nullable = false, updatable = false),},
			inverseJoinColumns = { @JoinColumn(name = "author",
					nullable = false, updatable = false) })
	private List<Author> authors = new ArrayList<>();


	@ManyToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL)
	@JoinTable(name = "publication_identifier",  joinColumns = {
			@JoinColumn(name = "publication", nullable = false, updatable = false),},
			inverseJoinColumns = { @JoinColumn(name = "identifier",
					nullable = false, updatable = false) })
	private List<Identifier> identifiers = new ArrayList<>();

	@OneToOne//(cascade = CascadeType.ALL)
	@JoinColumn(name = "journal")
	private Journal journal;

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

	@Basic
	@Convert(converter=PublicationConverter.class)
	private PublicationType type;



	public Publication() { }

	public Date getAcceptancedate() {
		return this.acceptancedate;
	}

	public void setAcceptancedate(Date acceptancedate) {
		this.acceptancedate = acceptancedate;
	}

	public String getAlternativedoi() {
		return this.alternativedoi;
	}

	public void setAlternativedoi(String alternativedoi) {
		this.alternativedoi = alternativedoi;
	}

	public String getAlternativetitle() {
		return this.alternativetitle;
	}

	public void setAlternativetitle(String alternativetitle) {
		this.alternativetitle = alternativetitle;
	}

	public Date getDate() {
		return this.date;
	}

	public void setDate(Date date) {
		this.date = date;
	}

	public String getDoi() {
		return this.doi;
	}

	public void setDoi(String doi) {
		this.doi = doi;
	}

	public String getEventdetails() {
		return this.eventdetails;
	}

	public void setEventdetails(String eventdetails) {
		this.eventdetails = eventdetails;
	}

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

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

	public Journal getJournal() {
		return this.journal;
	}

	public void setJournal(Journal journal) {
		this.journal = journal;
	}

	public String getLanguages() {
		return this.languages;
	}

	public void setLanguages(String languages) {
		this.languages = languages;
	}

	public String getLicense() {
		return this.license;
	}

	public void setLicense(String license) {
		this.license = license;
	}

	public Publisher getPublisher() {
		return this.publisher;
	}

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

	public String getRepository() {
		return this.repository;
	}

	public void setRepository(String repository) {
		this.repository = repository;
	}

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

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

	public String getSubjects() {
		return this.subjects;
	}

	public void setSubjects(String subjects) {
		this.subjects = subjects;
	}

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

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

	public PublicationType getType() {
		return this.type;
	}

	public void setType(PublicationType type) {
		this.type = type;
	}

	public List<Identifier> getIdentifiers() {
		return identifiers;
	}

	public void setIdentifiers(List<Identifier> identifiers) {
		this.identifiers = identifiers;
	}

	public void addIdentifier(Identifier i){
		this.identifiers.add(i);
	}

	public void removeIdentifier(Identifier i){
		this.identifiers.remove(i);
	}

	public List<Author> getAuthors() {
		return authors;
	}

	public void setAuthors(List<Author> authors) {
		this.authors = authors;
	}


}