package com.sonymusic.dx.persistence.gras;

import java.sql.Timestamp;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import org.hibernate.type.YesNoConverter;

import com.sonymusic.dx.persistence.converter.StringToDateConverter;

import jakarta.persistence.Column;
import jakarta.persistence.Convert;
import jakarta.persistence.Entity;
import jakarta.persistence.FetchType;
import jakarta.persistence.Id;
import jakarta.persistence.JoinColumn;
import jakarta.persistence.JoinTable;
import jakarta.persistence.ManyToMany;
import jakarta.persistence.ManyToOne;
import jakarta.persistence.OrderBy;
import jakarta.persistence.Table;
import jakarta.persistence.Transient;
import jakarta.validation.constraints.NotNull;

@Entity
@Table(name = "vgras006")
public class Participant extends RAASClientSpecificEntity {

	private static final long serialVersionUID = 1L;

	@Id
	@Column(name = "particip_no", insertable = false, updatable = false)
	private Long participantNo;

	@NotNull
	@Column(name = "particip_full_name")
	private String fullName;

	@NotNull
	@Column(name = "particip_full_match")
	private String fullMatchName;

	@Column(name = "first_name")
	private String firstName;

	@Column(name = "last_name")
	private String lastName;

	@Column(name = "bleed")
	private String bleed;

	@Column(name = "particip_idx_name")
	private String indexName;

	@Column(name = "legal_first_name")
	private String legalFirstName;

	@Column(name = "legal_last_name")
	private String legalLastName;

	@Column(name = "preferred_flag")
	@Convert(converter = YesNoConverter.class)
	private boolean isPreferredParticipant;

	/*
	 * @Column(name = "preferred_flag")
	 * 
	 * @Type(type = "yes_no") private boolean isPreferredParticipant;
	 * 
	 * @Column(name = "date_of_birth")
	 * 
	 * @Type(type = "string_date_type") private Date dateOfBirth;
	 * 
	 * @Column(name = "date_of_death")
	 * 
	 * @Type(type = "string_date_type") private Date dateOfDeath;
	 */
	@Column(name = "most_freq_tasks")
	private String mostFrequestTasks;

	@Column(name = "main_artist_count")
	private Long mainArtistCount;

	@Column(name = "particip_fam_no")
	private Long participantFamilyNo;

	/*
	 * @Column(name = "is_particip_fam_head")
	 * 
	 * @Type(type = "yes_no") private boolean isParticipantFamilyHead;
	 */

	@Column(name = "log_mod_stamp")
	private Timestamp lastLogicalModificationTime;

	@Column(name = "log_mod_user")
	private String lastLogicalModifificationUser;

	/*
	 * @Column(name = "raas_init_date")
	 * 
	 * @Type(type = "string_date_type") private Date dateInitiated;
	 */

	@Column(name = "raas_init_date")
	@Convert(converter = StringToDateConverter.class)
	private Date dateInitiated;

	@Transient
	public String getFormattedDateInitiated(){
		if (dateInitiated ==null) return null;
		return new SimpleDateFormat("dd MMM yyyy").format(dateInitiated);
	}

	@Column(name = "raas_init_user")
	private String initiatedByGRASUser;

	@Column(name = "apple_artist_id")
	private Long appleArtistId;

	@Column(name = "particip_spotify_uri")
	private String spotifyArtistId;

	@Column(name = "isni")
	private String isni;

	@Column(name = "characteristics_tid")
	private Long characteriscsTextId;

	@Column(name = "city_ident")
	private String cityIdentification;

	@ManyToOne(fetch = FetchType.LAZY, optional = true)
	@JoinColumn(name = "data_source_key")
	private DataSource dataSource;

	@ManyToOne(fetch = FetchType.LAZY)
	@JoinColumn(name = "particip_type_key")
	private ParticipantType participantType;

	@ManyToMany(fetch = FetchType.LAZY)
	@JoinTable(name = "vgras240", joinColumns = @JoinColumn(name = "particip_no", insertable = false, updatable = false),
			inverseJoinColumns = @JoinColumn(name = "particip_subtype_key", insertable = false, updatable = false))
	@OrderBy("participantSubTypeName")
	private List<ParticipantSubType> subTypes = new ArrayList<ParticipantSubType>();

	@Column(name = "rep_owner_key")
	private String repOwnerKey;

	@Transient
	private RepertoireOwner repertoireOwner;

	@ManyToOne(fetch = FetchType.LAZY)
	@JoinColumn(name = "raas_init_key")
	private Company initiatedByCompany;

	public Participant(){

	}


	public Participant(Long participantNo
			, String fullName, String firstName,
						  String lastName, String bleed, String indexName, String legalFirstName,
						  String legalLastName, boolean isPreferredParticipant, String mostFrequestTasks,
						  Long mainArtistCount,
					      Date dateInitiated,
					   	  Long characteriscsTextId,
						  String dataSource,
						  String participantType,
						  String repertoireOwner,
						  String initiatedByCompany,
					      String initiatedByGRASUser,
					      String isni
	) {
		this.participantNo = participantNo;
		this.fullName = fullName;
		this.firstName = firstName;
		this.lastName = lastName;
		this.bleed = bleed;
		this.indexName = indexName;
		this.legalFirstName = legalFirstName;
		this.legalLastName = legalLastName;
		this.isPreferredParticipant = isPreferredParticipant;
		this.mostFrequestTasks = mostFrequestTasks;
		this.mainArtistCount = mainArtistCount;
		this.dateInitiated = dateInitiated;
		this.characteriscsTextId = characteriscsTextId;
		this.dataSource = new DataSource(dataSource);
		this.participantType = new ParticipantType(participantType);
//		this.initiatedByCompany = new Company(initiatedByCompany,repertoireOwner);
		this.initiatedByGRASUser = initiatedByGRASUser;
		this.isni = isni;
	}



	public Company getInitiatedByCompany() {
		return initiatedByCompany;
	}

	public void setInitiatedByCompany(Company initiatedByCompany) {
		this.initiatedByCompany = initiatedByCompany;
	}

	public RepertoireOwner getRepertoireOwner() {
		return repertoireOwner;
	}

	public void setRepertoireOwner(RepertoireOwner repertoireOwner) {
		this.repertoireOwner = repertoireOwner;
	}

	public String getRepOwnerKey() {
		return repOwnerKey;
	}

	public void setRepOwnerKey(String repOwnerKey) {
		this.repOwnerKey = repOwnerKey;
	}

	public DataSource getDataSource() {
		return dataSource;
	}

	public void setDataSource(DataSource dataSource) {
		this.dataSource = dataSource;
	}

	public ParticipantType getParticipantType() {
		return participantType;
	}

	public void setParticipantType(ParticipantType participantType) {
		this.participantType = participantType;
	}

	public List<ParticipantSubType> getSubTypes() {
		return subTypes;
	}

	public Date getDateInitiated() {
		return dateInitiated;
	}

	public void setDateInitiated(Date dateInitiated) {
		this.dateInitiated = dateInitiated;
	}

	public void setSubTypes(List<ParticipantSubType> subTypes) {
		this.subTypes = subTypes;
	}

	public Long getParticipantNo() {
		return participantNo;
	}

	public void setParticipantNo(Long participantNo) {
		this.participantNo = participantNo;
	}

	public String getFullName() {
		return fullName;
	}

	public void setFullName(String fullName) {
		this.fullName = fullName;
	}

	public String getFullMatchName() {
		return fullMatchName;
	}

	public void setFullMatchName(String fullMatchName) {
		this.fullMatchName = fullMatchName;
	}

	public String getFirstName() {
		return firstName;
	}

	public void setFirstName(String firstName) {
		this.firstName = firstName;
	}

	public String getLastName() {
		return lastName;
	}

	public void setLastName(String lastName) {
		this.lastName = lastName;
	}

	public String getBleed() {
		return bleed;
	}

	public void setBleed(String bleed) {
		this.bleed = bleed;
	}

	public String getIndexName() {
		return indexName;
	}

	public void setIndexName(String indexName) {
		this.indexName = indexName;
	}

	public String getLegalFirstName() {
		return legalFirstName;
	}

	public void setLegalFirstName(String legalFirstName) {
		this.legalFirstName = legalFirstName;
	}

	public String getLegalLastName() {
		return legalLastName;
	}

	public void setLegalLastName(String legalLastName) {
		this.legalLastName = legalLastName;
	}

	public String getMostFrequestTasks() {
		return mostFrequestTasks;
	}

	public void setMostFrequestTasks(String mostFrequestTasks) {
		this.mostFrequestTasks = mostFrequestTasks;
	}

	public Long getMainArtistCount() {
		return mainArtistCount;
	}

	public void setMainArtistCount(Long mainArtistCount) {
		this.mainArtistCount = mainArtistCount;
	}

	public Long getParticipantFamilyNo() {
		return participantFamilyNo;
	}

	public void setParticipantFamilyNo(Long participantFamilyNo) {
		this.participantFamilyNo = participantFamilyNo;
	}

	public Timestamp getLastLogicalModificationTime() {
		return lastLogicalModificationTime;
	}

	public void setLastLogicalModificationTime(Timestamp lastLogicalModificationTime) {
		this.lastLogicalModificationTime = lastLogicalModificationTime;
	}

	public String getLastLogicalModifificationUser() {
		return lastLogicalModifificationUser;
	}

	public void setLastLogicalModifificationUser(String lastLogicalModifificationUser) {
		this.lastLogicalModifificationUser = lastLogicalModifificationUser;
	}

	public String getInitiatedByGRASUser() {
		return initiatedByGRASUser;
	}

	public void setInitiatedByGRASUser(String initiatedByGRASUser) {
		this.initiatedByGRASUser = initiatedByGRASUser;
	}

	public Long getAppleArtistId() {
		return appleArtistId;
	}

	public void setAppleArtistId(Long appleArtistId) {
		this.appleArtistId = appleArtistId;
	}

	public String getSpotifyArtistId() {
		return spotifyArtistId;
	}

	public void setSpotifyArtistId(String spotifyArtistId) {
		this.spotifyArtistId = spotifyArtistId;
	}

	public String getIsni() {
		return isni;
	}

	public void setIsni(String isni) {
		this.isni = isni;
	}

	public Long getCharacteriscsTextId() {
		return characteriscsTextId;
	}

	public void setCharacteriscsTextId(Long characteriscsTextId) {
		this.characteriscsTextId = characteriscsTextId;
	}

	public String getCityIdentification() {
		return cityIdentification;
	}

	public void setCityIdentification(String cityIdentification) {
		this.cityIdentification = cityIdentification;
	}

	public boolean isPreferredParticipant() {
		return isPreferredParticipant;
	}

	public void setPreferredParticipant(boolean preferredParticipant) {
		isPreferredParticipant = preferredParticipant;
	}


}
