package io.delphiplatform.api.v3.rdb.entity;

import org.hibernate.annotations.Where;

import java.time.LocalDate;
import java.util.Set;

import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.JoinTable;
import javax.persistence.ManyToMany;
import javax.persistence.ManyToOne;
import javax.persistence.OneToMany;

import lombok.Getter;
import lombok.Setter;

@Entity(name = "artist")
@Getter
@Setter
public class ArtistEntity extends TrackedEntity {

    @Id
    private String artistId;
    private String description;
    private String participNo;
    private String fullName;
    private String firstName;
    private String lastName;
    private String spotifyArtistId;
    private Integer appleArtistId;
    private String spotifyPopularity;
    private LocalDate dateOfBirth;
    private LocalDate dateOfDeath;
    private String isni;
    @ManyToMany
    @JoinTable(
        name = "artist_product",
        joinColumns = {@JoinColumn(name = "artist_id")},
        inverseJoinColumns = {@JoinColumn(name = "product_id")}
    )
    private Set<ProductEntity> products;
    @ManyToMany
    @JoinTable(
        name = "artist_track",
        joinColumns = {@JoinColumn(name = "artist_id")},
        inverseJoinColumns = {@JoinColumn(name = "track_id")}
    )
    @Where(clause = MediaTypeEntity.AUDIO_MEDIA_TYPES_WHERE_CLAUSE)
    private Set<TrackEntity> tracks;
    @OneToMany(mappedBy = "participantId.artist", fetch = FetchType.LAZY)
    @Where(clause = "membership_type = 'Primary'")
    private Set<ParticipantEntity> participants;
    private LocalDate raasInitDate;
    private Integer mainArtistCount;
    private Integer aliasNo;
    private Integer participFamNo;
    private String participTypeName;
    private Boolean isParticipFamHead;
    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "raas_init_key")
    private CompanyEntity companyByCompanyKey;
    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "rep_owner_key")
    private RepertoireOwnerEntity repertoireOwner;

}
