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.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;
import jakarta.validation.constraints.NotNull;

@Entity
@Table(name = "vgras001")
public class Product extends RAASClientSpecificEntity implements Serializable {

	private static final long serialVersionUID = 1L;

	@Id
	@Column(name = "prod_no")
	private String productNumber;

	@ManyToOne(optional = false, fetch = FetchType.LAZY)
	@JoinColumn(name = "prod_vers_no")
	private ProductVersion productVersion;

	@Column(name = "barcode")
	private String barcode;

	@Column(name = "orig_prod_no")
	private String originalProductNumber;

	@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")
//    @Convert(converter = StringToDateConverter.class)
	private String raasInitiatedDate;

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

	@Column(name = "config_set")
	@NotNull
	private Long configSet;

	@ManyToOne(optional = false, fetch = FetchType.LAZY)
	@JoinColumn(name = "config_key")
	private Configuration configuration;

	@Column(name = "sub_title")
	private String subTitle;

	@Column(name = "back_line")
	private String backLine;

	@Column(name = "is_complete")
	@NotNull
	@Convert(converter = YesNoConverter.class)
	private boolean isComplete;

	@Column(name = "edit_count")
	@NotNull
	private Long setCompleteCount;

	@Column(name = "merch_type")
	private String merchType;

	@Column(name = "merch_size")
	private String merchSize;

	@Column(name = "merch_colour")
	private String merchColor;

	@Column(name = "generate_skip")
	private Long generateSkip;

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

	@Column(name = "complete_user")
	private String setCompleteUser;

	@Column(name = "first_release_date")
//    @Convert(converter = StringToDateConverter.class)
	private String firstRelaseDate;

	@Column(name = "earlie_intl_release_date")
	private String earliestInternationalReleaseDate;

	@Column(name = "log_mod_stamp")
	@NotNull
	private Timestamp lastLogicalChangeDate;

	@Column(name = "log_mod_user")
	@NotNull
	private String lastLogicalChangeUser;

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

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

	@Column(name = "is_copy_controlled")
	@Convert(converter = YesNoConverter.class)
	private Boolean isCopyControlled;

	@Column(name = "generated_by_grid_flag")
	@Convert(converter = YesNoConverter.class)
	private Boolean isGeneratedByGrid;

	@Column(name = "grid_no")
	private String grid;

	@Column(name = "catlg_core_id")
	private String catlgCoreId;

	@Column(name = "catlg_pfix_id")
	private String catlgPfixId;

	@Column(name = "affiliate_id")
	private String affiliateId;

	@ManyToOne(fetch = FetchType.LAZY)
	@JoinColumn(name = "generated_from_prod_no")
	private Product generatedFromProduct;

	@Column(name = "is_confidential")
	@Convert(converter = YesNoConverter.class)
	private boolean isConfidential;

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

	@ManyToOne(optional = false, fetch = FetchType.LAZY)
	@JoinColumn(name = "publish_key")
	private PublishStatus publishKey;

	@Column(name = "digital_barcode")
	private String digitalBarcode;

	@Column(name = "digital_title_suppl")
	private String digitalTitleSuppl;

	@Column(name = "digital_title_suppl_match")
	private String digitalTitleSupplMatch;

	@Column(name = "video_prd_company")
	private String videoProdCompany;

	@Column(name = "film_type_key")
	private Integer filmTypeKey;

	@Column(name = "cc_reason_key")
	private Integer closedReasonKey;

	@Column(name = "is_hd_available")
	@Convert(converter = YesNoConverter.class)
	private Boolean isHDAvailable;

	@Column(name = "isan")
	private String isan;

//    @ElementCollection
//    @Column(name = "text_part")
//    @JoinTable(name = "vgras029",joinColumns = @JoinColumn(name = "text_id", referencedColumnName = "glob_addit_info_tid"))
//    @OrderColumn(name = "seq_no")
//    private List<String> globalNotes = new ArrayList<String>();

//    @OneToOne(mappedBy = "product", optional = true)
//    private ProductAudioBookInfo productAudioBookInfo;

	@OneToMany(mappedBy = "product", fetch = FetchType.LAZY)
	private List<LocalProduct> localProducts = new ArrayList<LocalProduct>();

//    @OneToMany(mappedBy = "product", fetch = FetchType.LAZY)
//    private List<ProductComponent> components = new ArrayList<ProductComponent>();

//    @OneToMany(mappedBy = "product", fetch = FetchType.LAZY)
//    private List<ProductTrack> productTracks = new ArrayList<ProductTrack>();

//    @OneToMany(mappedBy = "product", fetch = FetchType.LAZY)
//    private List<ProductCountry> productCountries = new ArrayList<ProductCountry>();

//    @OneToMany(mappedBy = "product", fetch = FetchType.LAZY)
//    private List<ProductSalesData> productSalesData = new ArrayList<ProductSalesData>();

//    @OneToMany(mappedBy = "product", fetch = FetchType.LAZY)
//    private List<ProductUsage> productUsage = new ArrayList<ProductUsage>();

//    @OneToMany(mappedBy = "product", fetch = FetchType.LAZY)
//    private List<ProductLink> links = new ArrayList<ProductLink>();
//
//    @OneToMany(mappedBy = "product", fetch = FetchType.LAZY)
//    private List<ArtistUpdateProductLink> artistUpdateLinks = new ArrayList<ArtistUpdateProductLink>();
//
//    @OneToMany(mappedBy = "product", fetch = FetchType.LAZY)
//    private List<ScheduleEConfigInfo> scheduleEConfigs = new ArrayList<ScheduleEConfigInfo>();
//
//    @OneToMany(mappedBy = "product", fetch = FetchType.LAZY)
//    private List<DigitalSalesData> digitalSalesData = new ArrayList<DigitalSalesData>();
//
//    @OneToMany(mappedBy = "product")
//    private List<ProductLocalization> productLocalLanguages = new ArrayList<ProductLocalization>();
//
//    @OneToMany(mappedBy = "product", fetch = FetchType.LAZY)
//    @OrderBy(clause = "idNo")
//    private List<ProductAudioBookDescription> productAudioBookDescriptions = new ArrayList<ProductAudioBookDescription>();

	public String getFirstRelaseDate() {
		return firstRelaseDate;
	}

	public void setFirstRelaseDate(String firstRelaseDate) {
		this.firstRelaseDate = firstRelaseDate;
	}

	public String getProductNumber() {
		return productNumber;
	}

	public void setProductNumber(String productNumber) {
		this.productNumber = productNumber;
	}

	public String getBarcode() {
		return barcode;
	}

	public void setBarcode(String barcode) {
		this.barcode = barcode;
	}

	public String getOriginalProductNumber() {
		return originalProductNumber;
	}

	public void setOriginalProductNumber(String originalProductNumber) {
		this.originalProductNumber = originalProductNumber;
	}

	public Company getRaasInitiatingCompany() {
		return raasInitiatingCompany;
	}

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

	public ProductVersion getProductVersion() {
		return productVersion;
	}

	public void setProductVersion(ProductVersion productVersion) {
		this.productVersion = productVersion;
	}

	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 Company getMaintenanceOwner() {
		return maintenanceOwner;
	}

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

	public @NotNull Long getConfigSet() {
		return configSet;
	}

	public void setConfigSet(@NotNull Long configSet) {
		this.configSet = configSet;
	}

	public Configuration getConfiguration() {
		return configuration;
	}

	public void setConfiguration(Configuration configuration) {
		this.configuration = configuration;
	}

	public String getSubTitle() {
		return subTitle;
	}

	public void setSubTitle(String subTitle) {
		this.subTitle = subTitle;
	}

	public String getBackLine() {
		return backLine;
	}

	public void setBackLine(String backLine) {
		this.backLine = backLine;
	}

	@NotNull
	public boolean isComplete() {
		return isComplete;
	}

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

	public @NotNull Long getSetCompleteCount() {
		return setCompleteCount;
	}

	public void setSetCompleteCount(@NotNull Long setCompleteCount) {
		this.setCompleteCount = setCompleteCount;
	}

	public String getMerchType() {
		return merchType;
	}

	public void setMerchType(String merchType) {
		this.merchType = merchType;
	}

	public String getMerchSize() {
		return merchSize;
	}

	public void setMerchSize(String merchSize) {
		this.merchSize = merchSize;
	}

	public String getMerchColor() {
		return merchColor;
	}

	public void setMerchColor(String merchColor) {
		this.merchColor = merchColor;
	}

	public Long getGenerateSkip() {
		return generateSkip;
	}

	public void setGenerateSkip(Long generateSkip) {
		this.generateSkip = generateSkip;
	}

	public Timestamp getSetCompleteDate() {
		return setCompleteDate;
	}

	public void setSetCompleteDate(Timestamp setCompleteDate) {
		this.setCompleteDate = setCompleteDate;
	}

	public String getSetCompleteUser() {
		return setCompleteUser;
	}

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

	public String getEarliestInternationalReleaseDate() {
		return earliestInternationalReleaseDate;
	}

	public void setEarliestInternationalReleaseDate(String earliestInternationalReleaseDate) {
		this.earliestInternationalReleaseDate = earliestInternationalReleaseDate;
	}

	public @NotNull Timestamp getLastLogicalChangeDate() {
		return lastLogicalChangeDate;
	}

	public void setLastLogicalChangeDate(@NotNull Timestamp lastLogicalChangeDate) {
		this.lastLogicalChangeDate = lastLogicalChangeDate;
	}

	public @NotNull String getLastLogicalChangeUser() {
		return lastLogicalChangeUser;
	}

	public void setLastLogicalChangeUser(@NotNull String lastLogicalChangeUser) {
		this.lastLogicalChangeUser = lastLogicalChangeUser;
	}

	public String getcLine() {
		return cLine;
	}

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

	public DataSource getDataSource() {
		return dataSource;
	}

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

	public Boolean getCopyControlled() {
		return isCopyControlled;
	}

	public void setCopyControlled(Boolean copyControlled) {
		isCopyControlled = copyControlled;
	}

	public Boolean getGeneratedByGrid() {
		return isGeneratedByGrid;
	}

	public void setGeneratedByGrid(Boolean generatedByGrid) {
		isGeneratedByGrid = generatedByGrid;
	}

	public String getGrid() {
		return grid;
	}

	public void setGrid(String grid) {
		this.grid = grid;
	}

	public String getCatlgCoreId() {
		return catlgCoreId;
	}

	public void setCatlgCoreId(String catlgCoreId) {
		this.catlgCoreId = catlgCoreId;
	}

	public String getCatlgPfixId() {
		return catlgPfixId;
	}

	public void setCatlgPfixId(String catlgPfixId) {
		this.catlgPfixId = catlgPfixId;
	}

	public String getAffiliateId() {
		return affiliateId;
	}

	public void setAffiliateId(String affiliateId) {
		this.affiliateId = affiliateId;
	}

	public Product getGeneratedFromProduct() {
		return generatedFromProduct;
	}

	public void setGeneratedFromProduct(Product generatedFromProduct) {
		this.generatedFromProduct = generatedFromProduct;
	}

	public boolean isConfidential() {
		return isConfidential;
	}

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

	public Long getGlobalAdditionalInfoTId() {
		return globalAdditionalInfoTId;
	}

	public void setGlobalAdditionalInfoTId(Long globalAdditionalInfoTId) {
		this.globalAdditionalInfoTId = globalAdditionalInfoTId;
	}

	public PublishStatus getPublishKey() {
		return publishKey;
	}

	public void setPublishKey(PublishStatus publishKey) {
		this.publishKey = publishKey;
	}

	public String getDigitalBarcode() {
		return digitalBarcode;
	}

	public void setDigitalBarcode(String digitalBarcode) {
		this.digitalBarcode = digitalBarcode;
	}

	public String getDigitalTitleSuppl() {
		return digitalTitleSuppl;
	}

	public void setDigitalTitleSuppl(String digitalTitleSuppl) {
		this.digitalTitleSuppl = digitalTitleSuppl;
	}

	public String getVideoProdCompany() {
		return videoProdCompany;
	}

	public void setVideoProdCompany(String videoProdCompany) {
		this.videoProdCompany = videoProdCompany;
	}

	public Integer getFilmTypeKey() {
		return filmTypeKey;
	}

	public void setFilmTypeKey(Integer filmTypeKey) {
		this.filmTypeKey = filmTypeKey;
	}

	public Integer getClosedReasonKey() {
		return closedReasonKey;
	}

	public void setClosedReasonKey(Integer closedReasonKey) {
		this.closedReasonKey = closedReasonKey;
	}

	public Boolean getHDAvailable() {
		return isHDAvailable;
	}

	public void setHDAvailable(Boolean HDAvailable) {
		isHDAvailable = HDAvailable;
	}

	public String getIsan() {
		return isan;
	}

	public void setIsan(String isan) {
		this.isan = isan;
	}

	public String getDigitalTitleSupplMatch() {
		return digitalTitleSupplMatch;
	}

	public void setDigitalTitleSupplMatch(String digitalTitleSupplMatch) {
		this.digitalTitleSupplMatch = digitalTitleSupplMatch;
	}

	// public List<String> getGlobalNotes() {
//        return globalNotes;
//    }
//
//    public void setGlobalNotes(List<String> globalNotes) {
//        this.globalNotes = globalNotes;
//    }
//
//    public ProductAudioBookInfo getProductAudioBookInfo() {
//        return productAudioBookInfo;
//    }
//
//    public void setProductAudioBookInfo(ProductAudioBookInfo productAudioBookInfo) {
//        this.productAudioBookInfo = productAudioBookInfo;
//    }

	public List<LocalProduct> getLocalProducts() {
		return localProducts;
	}

	public void setLocalProducts(List<LocalProduct> localProducts) {
		this.localProducts = localProducts;
	}

//    public List<ProductComponent> getComponents() {
//        return components;
//    }
//
//    public void setComponents(List<ProductComponent> components) {
//        this.components = components;
//    }

//    public List<ProductTrack> getProductTracks() {
//        return productTracks;
//    }
//
//    public void setProductTracks(List<ProductTrack> productTracks) {
//        this.productTracks = productTracks;
//    }

//    public List<ProductCountry> getProductCountries() {
//        return productCountries;
//    }
//
//    public void setProductCountries(List<ProductCountry> productCountries) {
//        this.productCountries = productCountries;
//    }
}
