package com.sonymusic.dx.persistence.gras;

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

import jakarta.persistence.Column;
import jakarta.persistence.Entity;
import jakarta.persistence.FetchType;
import jakarta.persistence.Id;
import jakarta.persistence.JoinColumn;
import jakarta.persistence.ManyToOne;
import jakarta.persistence.OneToMany;
import jakarta.persistence.Table;

@Entity
@Table(name = "vgras370")
public class Song extends RAASClientSpecificEntity implements Serializable {

    private static final long serialVersionUID = 1L;

    @Id
    @Column(name = "song_no", nullable = false)
    private Long songNumber;

    @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")
    private Company maintenanceOwner;

    @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_init_date")
    private String raasInitiatedDate;

    @Column(name = "song_notes", length = 2000)
    private String songNotes;

    @Column(name = "track_match", nullable = false, length = 250)
    private String trackMatchName;

    @Column(name = "track_name", nullable = false, length = 250)
    private String trackName;

    @OneToMany(mappedBy = "song")
    private List<Track> tracks = new ArrayList<Track>();

//    @OneToMany(mappedBy = "song")
//    private List<SongPublisher> songPublishers = new ArrayList<SongPublisher>();

    @OneToMany(mappedBy = "song")
    private List<SongCountry> songCountries = new ArrayList<SongCountry>();

//    @OneToMany(mappedBy = "song", fetch = FetchType.LAZY)
//    private List<SongParticipant> songParticipants = new ArrayList<SongParticipant>();

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

    public Long getSongNumber() {
        return songNumber;
    }

    public void setSongNumber(Long songNumber) {
        this.songNumber = songNumber;
    }

    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 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 getRaasInitiatedDate() {
        return raasInitiatedDate;
    }

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

    public String getSongNotes() {
        return songNotes;
    }

    public void setSongNotes(String songNotes) {
        this.songNotes = songNotes;
    }

    public String getTrackMatchName() {
        return trackMatchName;
    }

    public void setTrackMatchName(String trackMatchName) {
        this.trackMatchName = trackMatchName;
    }

    public String getTrackName() {
        return trackName;
    }

    public void setTrackName(String trackName) {
        this.trackName = trackName;
    }

    public List<Track> getTracks() {
        return tracks;
    }

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

    public List<SongCountry> getSongCountries() {
        return songCountries;
    }

    public void setSongCountries(List<SongCountry> songCountries) {
        this.songCountries = songCountries;
    }

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

    @Override
    public boolean equals(Object obj) {
        if (this == obj)
            return true;
        if (obj == null)
            return false;
        if (!(obj instanceof Song))
            return false;
        Song other = (Song) obj;
        if (getSongNumber() == null) {
            if (other.getSongNumber() != null)
                return false;
        } else if (!getSongNumber().equals(other.getSongNumber()))
            return false;
        return true;
    }

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

    public Language getLanguage() {
        return language;
    }

}