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

import java.time.LocalDate;
import java.util.List;
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 javax.persistence.OrderColumn;

import lombok.Getter;
import lombok.Setter;

@Entity(name = "product_version")
@Getter
@Setter
public class ProductVersionEntity extends TrackedEntity {

    @Id
    private Integer prodVersNo;
    private Integer prodFamNo;
    private boolean isProdFamHead;
    private String prodTitle;
    private String prodTitleSuppl;
    private LocalDate effectiveDateFrom;
    private Boolean soundtrackFlag;
    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "prod_class_key", nullable = false)
    private ProductClassEntity productClass;
    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "rep_owner_key", nullable = false)
    private RepertoireOwnerEntity repertoireOwner;
    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "main_artist_id", nullable = false)
    private ArtistEntity mainArtist;

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "config_cat_key", nullable = false)
    private ConfigurationCategoryEntity configurationCategory;
    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "genre_key", nullable = false)
    private GenreEntity genre;
    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "label_id", nullable = false)
    private LabelEntity label;
    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "created_in_project_id")
    private ProjectEntity createdInProject;
    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "title_language_key")
    private LanguageEntity titleLanguage;

    @ManyToMany
    @OrderColumn(name = "seq_no")
    @JoinTable(
        name = "project_product_version",
        joinColumns = {@JoinColumn(name = "prod_vers_no")},
        inverseJoinColumns = {@JoinColumn(name = "project_id")}
    )
    private List<ProjectEntity> projects;

    @OneToMany(mappedBy = "productVersion")
    private Set<ProductEntity> products;

}
