package com.sonymusic.dx.persistence.gras;

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

import org.hibernate.type.YesNoConverter;

import jakarta.persistence.Column;
import jakarta.persistence.Convert;
import jakarta.persistence.EmbeddedId;
import jakarta.persistence.Entity;
import jakarta.persistence.FetchType;
import jakarta.persistence.JoinColumn;
import jakarta.persistence.JoinTable;
import jakarta.persistence.ManyToMany;
import jakarta.persistence.ManyToOne;
import jakarta.persistence.OneToMany;
import jakarta.persistence.OrderBy;
import jakarta.persistence.Table;

@Entity
@Table(name = "vgras007")
public class Track extends RAASClientSpecificEntity implements Serializable {
    private static final long serialVersionUID = 1L;

    @EmbeddedId
    private TrackPk trackPk;

    @Column(name = "c_line", length = 250)
    private String cLine;

    @Column(name = "complete_stamp")
    private Timestamp dateSetComplete;

    @Column(name = "complete_user", length = 8)
    private String completeUser;

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

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


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

    @Column(name = "edit_count", nullable = false)
    private Long editCount;

    @Column(name = "excl_from_split_deal", length = 1)
    @Convert(converter = YesNoConverter.class)
    private Boolean isExcludedFromSplitDeal;

    @Column(name = "extract_flag", nullable = false, length = 1)
    @Convert(converter = YesNoConverter.class)
    private boolean isExtractedFromOtherTrack;

    @Column(name = "first_rel_on_prod", length = 50)
    private String firstRelOnProd;

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

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "track_subtype_key")
    private TrackSubType trackSubType;

    @Column(name = "glob_addit_info_tid")
    private Long globAdditInfoTid;

    @Column(name = "grid_no", length = 18)
    private String gridNo;

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "track_type_key")
    private TrackType trackType;

    @Column(name = "is_complete", nullable = false, length = 1)
    @Convert(converter = YesNoConverter.class)
    private boolean isComplete;

    @Column(name = "is_confidential", nullable = false, length = 1)
    @Convert(converter = YesNoConverter.class)
    private boolean isConfidential;

    @Column(name = "is_logical_track_flag", length = 1)
    @Convert(converter = YesNoConverter.class)
    private Boolean isLogicalTrack;

    @Column(name = "c_line_for_lyrics", length = 250)
    private String cLineForLyrics;

    @Column(length = 12)
    private String isrc;

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

    @Column(name = "live_rec_flag", nullable = false, length = 1)
    @Convert(converter = YesNoConverter.class)
    private boolean isLiveRecording;

    @Column(name = "log_mod_stamp", nullable = false)
    private Timestamp logModStamp;

    @Column(name = "log_mod_user", nullable = false, length = 8)
    private String logModUser;

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

    @Column(name = "matrix_no", length = 20)
    private String matrixNo;

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

    @Column(name = "play_time")
    private Long playTime;

    @Column(name = "production_credits_tid")
    private Long productionCreditsTid;

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

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

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

    @Column(name = "raas_track_no", length = 20)
    private String displayTrackNumber;

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "record_country")
    private Country recordedInCountry;

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "copy_owner_country_key", referencedColumnName = "country_key", insertable = false, updatable = false)
    private Country copyOwnerCountry;

    @Column(name = "record_date", length = 8)
    private String dateRecorded;

    @Column(name = "record_period", length = 250)
    private String recordingPeriod;

    @Column(name = "record_place", length = 250)
    private String placeRecorded;

    @Column(name = "related_audio_isrc", length = 12)
    private String relatedAudioIsrc;

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

    @Column(name = "taken_from_isrc", length = 12)
    private String takenFromIsrc;

    @Column(name = "track_name_suppl", length = 250)
    private String trackNameSupplemental;

    @Column(name = "track_name_suppl_match", length = 250)
    private String trackMatchNameSupplemental;

    @Column(name = "suppl_title_internal")
    private String supplTitleInternal;


    @Column(name = "related_audio_isrc_review", length = 1)
    @Convert(converter = YesNoConverter.class)
    private Boolean isRelatedAudioIsrcReview;

    @Column(name = "lyrics_utid")
    private Long lyricsId;

    @Column(name = "curation_info_utid")
    private Long curationInfoUtid;

    @Column(name = "orig_release_date")
    private String originalReleaseDate;

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "song_no")
    private Song song;

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "lyrics_indicator_key")
    private LyricsType lyricsType;

    @OneToMany(mappedBy = "track", fetch = FetchType.LAZY)
    @OrderBy("sequenceNo")
    private List<TrackParticipant> trackParticipants = new ArrayList<TrackParticipant>();

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "src_audio_encoding_key")
    private AudioEncodingType sourceAudioEncodingType;

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "src_video_encoding_key")
    private VideoEncodingType sourceVideoEncodingType;

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "track_media_key")
    private TrackMediaType trackMediaType;

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "sound_key")
    private SoundCode soundCode;

    @ManyToMany(fetch = FetchType.LAZY)
    @JoinTable(name = "vgras255", schema = "dbo", catalog = "DSAM000",
            joinColumns = { @JoinColumn(name = "track_no", referencedColumnName = "track_no"), @JoinColumn(name = "track_ext", referencedColumnName = "track_ext") },
            inverseJoinColumns = { @JoinColumn(name = "footage_type_key", referencedColumnName = "footage_type_key") })
    private List<FootageType> footageTypes;

//    @OneToMany(mappedBy = "track", fetch = FetchType.LAZY)
//    private List<TrackSplitDeal> trackSplitDeals = new ArrayList<TrackSplitDeal>();

//    public List<TrackSplitDeal> getTrackSplitDeals() {
//        return trackSplitDeals;
//    }
//
//    public void setTrackSplitDeals(List<TrackSplitDeal> trackSplitDeals) {
//        this.trackSplitDeals = trackSplitDeals;
//    }


    public List<FootageType> getFootageTypes() {
        return footageTypes;
    }

    public void setFootageTypes(List<FootageType> footageTypes) {
        this.footageTypes = footageTypes;
    }

    public SoundCode getSoundCode() {
        return soundCode;
    }

    public void setSoundCode(SoundCode soundCode) {
        this.soundCode = soundCode;
    }

    public VideoEncodingType getSourceVideoEncodingType() {
        return sourceVideoEncodingType;
    }

    public void setSourceVideoEncodingType(VideoEncodingType sourceVideoEncodingType) {
        this.sourceVideoEncodingType = sourceVideoEncodingType;
    }

    public TrackMediaType getTrackMediaType() {
        return trackMediaType;
    }

    public void setTrackMediaType(TrackMediaType trackMediaType) {
        this.trackMediaType = trackMediaType;
    }

    public AudioEncodingType getSourceAudioEncodingType() {
        return sourceAudioEncodingType;
    }

    public void setSourceAudioEncodingType(AudioEncodingType sourceAudioEncodingType) {
        this.sourceAudioEncodingType = sourceAudioEncodingType;
    }

    public List<TrackParticipant> getTrackParticipants() {
        return trackParticipants;
    }

    public void setTrackParticipants(List<TrackParticipant> trackParticipants) {
        this.trackParticipants = trackParticipants;
    }

    public TrackPk getTrackPk() {
        return trackPk;
    }

    public void setTrackPk(TrackPk trackPk) {
        this.trackPk = trackPk;
    }

    public String getcLine() {
        return cLine;
    }

    public void setcLine(String cLine) {
        this.cLine = cLine;
    }

    public Timestamp getDateSetComplete() {
        return dateSetComplete;
    }

    public void setDateSetComplete(Timestamp dateSetComplete) {
        this.dateSetComplete = dateSetComplete;
    }

    public String getCompleteUser() {
        return completeUser;
    }

    public void setCompleteUser(String completeUser) {
        this.completeUser = completeUser;
    }

    public Timestamp getDateSetConfiidential() {
        return dateSetConfiidential;
    }

    public void setDateSetConfiidential(Timestamp dateSetConfiidential) {
        this.dateSetConfiidential = dateSetConfiidential;
    }

    public String getConfidentialUser() {
        return confidentialUser;
    }

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

    public DataSource getDataSource() {
        return dataSource;
    }

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

    public Long getEditCount() {
        return editCount;
    }

    public void setEditCount(Long editCount) {
        this.editCount = editCount;
    }

    public Boolean getExcludedFromSplitDeal() {
        return isExcludedFromSplitDeal;
    }

    public void setExcludedFromSplitDeal(Boolean excludedFromSplitDeal) {
        isExcludedFromSplitDeal = excludedFromSplitDeal;
    }

    public boolean isExtractedFromOtherTrack() {
        return isExtractedFromOtherTrack;
    }

    public void setExtractedFromOtherTrack(boolean extractedFromOtherTrack) {
        isExtractedFromOtherTrack = extractedFromOtherTrack;
    }

    public String getFirstRelOnProd() {
        return firstRelOnProd;
    }

    public void setFirstRelOnProd(String firstRelOnProd) {
        this.firstRelOnProd = firstRelOnProd;
    }

    public Genre getGenre() {
        return genre;
    }

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

    public Long getGlobAdditInfoTid() {
        return globAdditInfoTid;
    }

    public void setGlobAdditInfoTid(Long globAdditInfoTid) {
        this.globAdditInfoTid = globAdditInfoTid;
    }

    public String getGridNo() {
        return gridNo;
    }

    public void setGridNo(String gridNo) {
        this.gridNo = gridNo;
    }

    public boolean isComplete() {
        return isComplete;
    }

    public void setComplete(boolean complete) {
        isComplete = complete;
    }

    public boolean isConfidential() {
        return isConfidential;
    }

    public void setConfidential(boolean confidential) {
        isConfidential = confidential;
    }

    public Boolean getLogicalTrack() {
        return isLogicalTrack;
    }

    public void setLogicalTrack(Boolean logicalTrack) {
        isLogicalTrack = logicalTrack;
    }

    public String getcLineForLyrics() {
        return cLineForLyrics;
    }

    public void setcLineForLyrics(String cLineForLyrics) {
        this.cLineForLyrics = cLineForLyrics;
    }

    public String getIsrc() {
        return isrc;
    }

    public void setIsrc(String isrc) {
        this.isrc = isrc;
    }

    public Language getLanguage() {
        return language;
    }

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

    public boolean isLiveRecording() {
        return isLiveRecording;
    }

    public void setLiveRecording(boolean liveRecording) {
        isLiveRecording = liveRecording;
    }

    public Timestamp getLogModStamp() {
        return logModStamp;
    }

    public void setLogModStamp(Timestamp logModStamp) {
        this.logModStamp = logModStamp;
    }

    public String getLogModUser() {
        return logModUser;
    }

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

    public Company getMaintenanceOwner() {
        return maintenanceOwner;
    }

    public void setMaintenanceOwner(Company maintenanceOwner) {
        this.maintenanceOwner = maintenanceOwner;
    }

    public String getMatrixNo() {
        return matrixNo;
    }

    public void setMatrixNo(String matrixNo) {
        this.matrixNo = matrixNo;
    }

    public String getpLine() {
        return pLine;
    }

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

    public Long getPlayTime() {
        return playTime;
    }

    public void setPlayTime(Long playTime) {
        this.playTime = playTime;
    }

    public Long getProductionCreditsTid() {
        return productionCreditsTid;
    }

    public void setProductionCreditsTid(Long productionCreditsTid) {
        this.productionCreditsTid = productionCreditsTid;
    }

    public String getRaasInitiatedDate() {
        return raasInitiatedDate;
    }

    public void setRaasInitiatedDate(String raasInitiatedDate) {
        this.raasInitiatedDate = raasInitiatedDate;
    }

    public Company getRaasInitiatingCompany() {
        return raasInitiatingCompany;
    }

    public void setRaasInitiatingCompany(Company raasInitiatingCompany) {
        this.raasInitiatingCompany = raasInitiatingCompany;
    }

    public String getRaasInitiatingUser() {
        return raasInitiatingUser;
    }

    public void setRaasInitiatingUser(String raasInitiatingUser) {
        this.raasInitiatingUser = raasInitiatingUser;
    }

    public String getDisplayTrackNumber() {
        return displayTrackNumber;
    }

    public void setDisplayTrackNumber(String displayTrackNumber) {
        this.displayTrackNumber = displayTrackNumber;
    }

    public Country getRecordedInCountry() {
        return recordedInCountry;
    }

    public void setRecordedInCountry(Country recordedInCountry) {
        this.recordedInCountry = recordedInCountry;
    }

    public Country getCopyOwnerCountry() {
        return copyOwnerCountry;
    }

    public void setCopyOwnerCountry(Country copyOwnerCountry) {
        this.copyOwnerCountry = copyOwnerCountry;
    }

    public String getDateRecorded() {
        return dateRecorded;
    }

    public void setDateRecorded(String dateRecorded) {
        this.dateRecorded = dateRecorded;
    }

    public String getRecordingPeriod() {
        return recordingPeriod;
    }

    public void setRecordingPeriod(String recordingPeriod) {
        this.recordingPeriod = recordingPeriod;
    }

    public String getPlaceRecorded() {
        return placeRecorded;
    }

    public void setPlaceRecorded(String placeRecorded) {
        this.placeRecorded = placeRecorded;
    }

    public String getRelatedAudioIsrc() {
        return relatedAudioIsrc;
    }

    public void setRelatedAudioIsrc(String relatedAudioIsrc) {
        this.relatedAudioIsrc = relatedAudioIsrc;
    }

    public Company getRepertoireOwner() {
        return repertoireOwner;
    }

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

    public String getTakenFromIsrc() {
        return takenFromIsrc;
    }

    public void setTakenFromIsrc(String takenFromIsrc) {
        this.takenFromIsrc = takenFromIsrc;
    }

    public String getTrackNameSupplemental() {
        return trackNameSupplemental;
    }

    public void setTrackNameSupplemental(String trackNameSupplemental) {
        this.trackNameSupplemental = trackNameSupplemental;
    }

    public String getTrackMatchNameSupplemental() {
        return trackMatchNameSupplemental;
    }

    public void setTrackMatchNameSupplemental(String trackMatchNameSupplemental) {
        this.trackMatchNameSupplemental = trackMatchNameSupplemental;
    }

    public String getSupplTitleInternal() {
        return supplTitleInternal;
    }

    public void setSupplTitleInternal(String supplTitleInternal) {
        this.supplTitleInternal = supplTitleInternal;
    }

    public Boolean getRelatedAudioIsrcReview() {
        return isRelatedAudioIsrcReview;
    }

    public void setRelatedAudioIsrcReview(Boolean relatedAudioIsrcReview) {
        isRelatedAudioIsrcReview = relatedAudioIsrcReview;
    }

    public Long getLyricsId() {
        return lyricsId;
    }

    public void setLyricsId(Long lyricsId) {
        this.lyricsId = lyricsId;
    }

    public Long getCurationInfoUtid() {
        return curationInfoUtid;
    }

    public void setCurationInfoUtid(Long curationInfoUtid) {
        this.curationInfoUtid = curationInfoUtid;
    }

    public String getOriginalReleaseDate() {
        return originalReleaseDate;
    }

    public void setOriginalReleaseDate(String originalReleaseDate) {
        this.originalReleaseDate = originalReleaseDate;
    }

    public Song getSong() {
        return song;
    }

    public void setSong(Song song) {
        this.song = song;
    }


    public LyricsType getLyricsType() {
        return lyricsType;
    }

    public void setLyricsType(LyricsType lyricsType) {
        this.lyricsType = lyricsType;
    }

    public TrackType getTrackType() {
        return trackType;
    }

    public void setTrackType(TrackType trackType) {
        this.trackType = trackType;
    }

    public TrackSubType getTrackSubType() {
        return trackSubType;
    }

    public void setTrackSubType(TrackSubType trackSubType) {
        this.trackSubType = trackSubType;
    }
}