package com.sonymusic.dx.persistence.gras;

import jakarta.persistence.*;
import org.hibernate.type.YesNoConverter;

import java.io.Serializable;
import java.sql.Timestamp;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

@Entity
@Table(name = "vgras360")
public class RecordingProject extends RAASClientSpecificEntity implements Serializable {

	private static final long serialVersionUID = 1L;

	@Id
	@Column(name = "rec_project_id")
	private Long recordingProjectId;

	@Column(name = "rec_project_number")
	private String recordingProjectNumber;

	@Column(name = "rec_project_title")
	private String recordingProjectTitle;

	@Column(name = "rec_project_match")
	private String recordingProjectMatch;

	@ManyToOne(optional = false, fetch = FetchType.LAZY)
	@JoinColumn(name = "rec_project_type")
	private RecordingProjectType recordingProjectType;

	@ManyToOne(optional = false, fetch = FetchType.LAZY)
	@JoinColumn(name = "rep_owner_key", referencedColumnName = "company_key")
	private Company repertoireOwner;

	@ManyToOne(optional = false, fetch = FetchType.LAZY)
	@JoinColumn(name = "maint_owner_key", referencedColumnName = "company_key")
	private Company maintanceOwner;

	@ManyToOne(optional = false, fetch = FetchType.LAZY)
	@JoinColumns({ @JoinColumn(name = "label_key", referencedColumnName = "label_key"),
			@JoinColumn(name = "label_ext", referencedColumnName = "label_ext") })
	private Label label;

	@ManyToOne(optional = true, fetch = FetchType.LAZY)
	@JoinColumn(name = "genre_key", referencedColumnName = "genre_key")
	private Genre genre;

	@ManyToOne(fetch = FetchType.LAZY)
	@JoinColumn(name = "raas_init_key")
	private Company initiatedByCompany;

	@Column(name = "raas_init_date")
	private String raasInitDate;

	@Column(name = "raas_init_user")
	private String raasInitUser;

	@ManyToOne(fetch = FetchType.LAZY)
	@JoinColumn(name = "data_source_key")
	private DataSource dataSource;

	@Column(name = "log_mod_stamp")
	private Timestamp logLastModificationDate;

	@Column(name = "log_mod_user")
	private String logModUser;

	@Column(name = "is_confidential")
	@Convert(converter = YesNoConverter.class)
	private Boolean isConfidential;

	@Column(name = "confidential_user")
	private String confidentialUser;

	@Column(name = "confidential_stamp")
	private Timestamp confidentialDate;

	@Column(name = "orig_rec_project_number")
	private String origRecordingProjectNumber;

	// required by hibernate to correctly initialize globalNotes. Shouldn't be used
	// directly.
	@Column(name = "global_notes_tid")
	private Long globalNotesTId;

	@Column(name = "record_date")
	private Date recordDate;

	@Column(name = "record_place")
	private String recordPlace;

	@ManyToOne(fetch = FetchType.LAZY)
	@JoinColumn(name = "language_key", referencedColumnName = "language_key")
	private Language language;

	@Column(name = "record_period")
	private String recordPeriod;

	@ManyToOne(fetch = FetchType.LAZY)
	@JoinColumn(name = "record_country", referencedColumnName = "country_key")
	private Country country;

	@Column(name = "p_line")
	private String pLine;

	@OneToMany(mappedBy = "recordingProject")
	private List<GlobalNote> globalNotesData = new ArrayList<GlobalNote>();

	@OneToMany(mappedBy = "recordingProject")
	private List<RecordingProjectParticipant> recordingProjectParticipants = new ArrayList<RecordingProjectParticipant>();

	@ManyToMany(mappedBy = "recordingProjects", fetch = FetchType.LAZY)
	private List<ProductVersion> productVersions = new ArrayList<ProductVersion>();

//    @ManyToMany(mappedBy = "recordingProjects", fetch = FetchType.LAZY)
//    private List<Track> tracks = new ArrayList<Track>();

//    @OneToMany(mappedBy = "recordingProject")
//    private List<RecordingProjectLink> links = new ArrayList<RecordingProjectLink>();

	@OneToMany(mappedBy = "recordingProject")
	private List<RecordingProjectCountry> recordingProjectCountries = new ArrayList<RecordingProjectCountry>();

//    @OneToMany(mappedBy = "publisher")
//    private List<RecordingProjectPublisher> publishers = new ArrayList<RecordingProjectPublisher>();

//    @OneToMany(mappedBy = "recordingProject", fetch = FetchType.LAZY)
//    private List<ArtistUpdateRecordingProjectLink> artistUpdateLinks = new ArrayList<ArtistUpdateRecordingProjectLink>();

	@ManyToMany(fetch = FetchType.LAZY)
	@JoinTable(name = "vgras365", joinColumns = @JoinColumn(name = "rec_project_id", referencedColumnName = "rec_project_id"), inverseJoinColumns = @JoinColumn(name = "dist_area_key", referencedColumnName = "dist_area_key"))
	private List<DistributionArea> distributionRightIncludes = new ArrayList<DistributionArea>();

	@ManyToMany(fetch = FetchType.LAZY)
	@JoinTable(name = "vgras366", joinColumns = @JoinColumn(name = "rec_project_id", referencedColumnName = "rec_project_id"), inverseJoinColumns = @JoinColumn(name = "dist_area_key", referencedColumnName = "dist_area_key"))
	private List<DistributionArea> distributionRightExcludes = new ArrayList<DistributionArea>();

	/**
	 * Protected, no-argument constructor should only be used by persistence engine.
	 */
	protected RecordingProject() {
	}

	public Long getRecordingProjectId() {
		return recordingProjectId;
	}

	public void setRecordingProjectId(Long recordingProjectId) {
		this.recordingProjectId = recordingProjectId;
	}

	public String getRecordingProjectNumber() {
		return recordingProjectNumber;
	}

	public void setRecordingProjectNumber(String recordingProjectNumber) {
		this.recordingProjectNumber = recordingProjectNumber;
	}

	public String getRecordingProjectTitle() {
		return recordingProjectTitle;
	}

	public void setRecordingProjectTitle(String recordingProjectTitle) {
		this.recordingProjectTitle = recordingProjectTitle;
	}

	public String getRecordingProjectMatch() {
		return recordingProjectMatch;
	}

	public void setRecordingProjectMatch(String recordingProjectMatch) {
		this.recordingProjectMatch = recordingProjectMatch;
	}

	public RecordingProjectType getRecordingProjectType() {
		return recordingProjectType;
	}

	public void setRecordingProjectType(RecordingProjectType recordingProjectType) {
		this.recordingProjectType = recordingProjectType;
	}

	public Company getRepertoireOwner() {
		return repertoireOwner;
	}

	public void setRepertoireOwner(Company repertoireOwner) {
		this.repertoireOwner = repertoireOwner;
	}

	public Company getMaintanceOwner() {
		return maintanceOwner;
	}

	public void setMaintanceOwner(Company maintanceOwner) {
		this.maintanceOwner = maintanceOwner;
	}

	public Label getLabel() {
		return label;
	}

	public void setLabel(Label label) {
		this.label = label;
	}

	public Genre getGenre() {
		return genre;
	}

	public void setGenre(Genre genre) {
		this.genre = genre;
	}

	public Company getInitiatedByCompany() {
		return initiatedByCompany;
	}

	public void setInitiatedByCompany(Company initiatedByCompany) {
		this.initiatedByCompany = initiatedByCompany;
	}

	public String getRaasInitUser() {
		return raasInitUser;
	}

	public void setRaasInitUser(String raasInitUser) {
		this.raasInitUser = raasInitUser;
	}

	public Timestamp getLogLastModificationDate() {
		return logLastModificationDate;
	}

	public void setLogLastModificationDate(Timestamp logLastModificationDate) {
		this.logLastModificationDate = logLastModificationDate;
	}

	public String getLogModUser() {
		return logModUser;
	}

	public void setLogModUser(String logModUser) {
		this.logModUser = logModUser;
	}

	public Boolean getIsConfidential() {
		return isConfidential;
	}

	public void setIsConfidential(Boolean isConfidential) {
		this.isConfidential = isConfidential;
	}

	public String getConfidentialUser() {
		return confidentialUser;
	}

	public void setConfidentialUser(String confidentialUser) {
		this.confidentialUser = confidentialUser;
	}

	public Timestamp getConfidentialDate() {
		return confidentialDate;
	}

	public void setConfidentialDate(Timestamp confidentialDate) {
		this.confidentialDate = confidentialDate;
	}

	public String getOrigRecordingProjectNumber() {
		return origRecordingProjectNumber;
	}

	public void setOrigRecordingProjectNumber(String origRecordingProjectNumber) {
		this.origRecordingProjectNumber = origRecordingProjectNumber;
	}

	public List<ProductVersion> getProductVersions() {
		return productVersions;
	}

	public void setProductVersions(List<ProductVersion> productVersions) {
		this.productVersions = productVersions;
	}

//    public List<Track> getTracks() {
//        return tracks;
//    }
//
//    public void setTracks(List<Track> tracks) {
//        this.tracks = tracks;
//    }

	public Date getRecordDate() {
		return recordDate;
	}

	public void setRecordDate(Date recordDate) {
		this.recordDate = recordDate;
	}

	public String getRecordPlace() {
		return recordPlace;
	}

	public void setRecordPlace(String recordPlace) {
		this.recordPlace = recordPlace;
	}

	public Language getLanguage() {
		return language;
	}

	public void setLanguage(Language language) {
		this.language = language;
	}

	public String getRecordPeriod() {
		return recordPeriod;
	}

	public void setRecordPeriod(String recordPeriod) {
		this.recordPeriod = recordPeriod;
	}

	public Country getCountry() {
		return country;
	}

	public void setCountry(Country country) {
		this.country = country;
	}

	public String getpLine() {
		return pLine;
	}

	public void setpLine(String pLine) {
		this.pLine = pLine;
	}

	public String getRaasInitDate() {
		return raasInitDate;
	}

	public void setRaasInitDate(String raasInitDate) {
		this.raasInitDate = raasInitDate;
	}

	// public List<RecordingProjectLink> getLinks() {
//        return links;
//    }
//
//    public void setLinks(List<RecordingProjectLink> links) {
//        this.links = links;
//    }

	public DataSource getDataSource() {
		return dataSource;
	}

	public void setDataSource(DataSource dataSource) {
		this.dataSource = dataSource;
	}

	public List<GlobalNote> getGlobalNotesData() {
		return globalNotesData;
	}

	public void setGlobalNotes(List<GlobalNote> globalNotesData) {
		this.globalNotesData = globalNotesData;
	}

	public List<RecordingProjectCountry> getRecordingProjectCountries() {
		return recordingProjectCountries;
	}

	public void setRecordingProjectCountries(List<RecordingProjectCountry> recordingProjectCountries) {
		this.recordingProjectCountries = recordingProjectCountries;
	}

//    public List<RecordingProjectPublisher> getPublishers() {
//        return publishers;
//    }
//
//    public void setPublishers(List<RecordingProjectPublisher> publishers) {
//        this.publishers = publishers;
//    }

	protected Long getGlobalNotesTId() {
		return globalNotesTId;
	}

	protected void setGlobalNotesTId(Long globalNotesTId) {
		this.globalNotesTId = globalNotesTId;
	}

	public List<RecordingProjectParticipant> getRecordingProjectParticipants() {
		return recordingProjectParticipants;
	}

	public void setRecordingProjectParticipants(List<RecordingProjectParticipant> recordingProjectParticipants) {
		this.recordingProjectParticipants = recordingProjectParticipants;
	}

//    public List<ArtistUpdateRecordingProjectLink> getArtistUpdateLinks() {
//        return artistUpdateLinks;
//    }
//
//    public void setArtistUpdateLinks(List<ArtistUpdateRecordingProjectLink> artistUpdateLinks) {
//        this.artistUpdateLinks = artistUpdateLinks;
//    }

	public List<DistributionArea> getDistributionRightIncludes() {
		return distributionRightIncludes;
	}

	public void setDistributionRightIncludes(List<DistributionArea> distributionRightIncludes) {
		this.distributionRightIncludes = distributionRightIncludes;
	}

	public List<DistributionArea> getDistributionRightExcludes() {
		return distributionRightExcludes;
	}

	public void setDistributionRightExcludes(List<DistributionArea> distributionRightExcludes) {
		this.distributionRightExcludes = distributionRightExcludes;
	}

	@Override
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result + ((recordingProjectId == null) ? 0 : recordingProjectId.hashCode());
		return result;
	}

	@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		final RecordingProject other = (RecordingProject) obj;
		if (recordingProjectId == null) {
			if (other.recordingProjectId != null)
				return false;
		} else if (!recordingProjectId.equals(other.recordingProjectId))
			return false;
		return true;
	}

}
