package com.sonymusic.dx.persistence.gras;

import java.io.Serializable;

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.Table;

@Entity
@Table(name = "vgras025")
public class Configuration extends RAASClientSpecificEntity implements Serializable {

    private static final long serialVersionUID = 1L;

    @Id
    @Column(name = "config_key")
    private String configKey;

    @Column(name = "config_name")
    private String configName;

    @Column(name = "config_short_name")
    private String configShortName;

    @ManyToOne(optional = false, fetch = FetchType.LAZY)
    @JoinColumn(name = "config_cat_key")
    private ConfigurationCategory configurationCategory;

    @Column(name = "upc_config_code")
    private String upcConfigCode;

    @Column(name = "no_of_sides")
    private Integer noOfSides;

    @Column(name = "has_scribe_no_flag")
    @Convert(converter = YesNoConverter.class)
    private Boolean hasScribeNo;

    @Column(name = "is_dmd_config_flag")
    @Convert(converter = YesNoConverter.class)
    private Boolean isDmdConfig;

    @Column(name = "has_x_rate")
    @Convert(converter = YesNoConverter.class)
    private Boolean hasXRate;

    @Column(name = "can_be_copy_controlled")
    @Convert(converter = YesNoConverter.class)
    private Boolean canBeCopyControlled;

    @Column(name = "is_dvd_config_flag")
    @Convert(converter = YesNoConverter.class)
    private Boolean isDvdConfig;

    @Column(name = "is_enhanced_config")
    @Convert(converter = YesNoConverter.class)
    private Boolean isEnhancedConfig;

    @Column(name = "is_single_track_config")
    @Convert(converter = YesNoConverter.class)
    private Boolean isSingleTrackConfig;

    @Column(name = "can_be_created_manually")
    @Convert(converter = YesNoConverter.class)
    private Boolean canBeCreatedManually;

    @Column(name = "can_be_generated")
    @Convert(converter = YesNoConverter.class)
    private Boolean canBeGenerated;

    @ManyToOne(optional = true, fetch = FetchType.LAZY)
    @JoinColumn(name = "generates_config_key")
    private Configuration generatesConfiguration;

//    @ManyToOne(optional = false, fetch = FetchType.LAZY)
//    @JoinColumn(name = "media_type_key")
//    private MediaType mediaType;

    @Column(name = "tracks_need_for_complete")
    @Convert(converter = YesNoConverter.class)
    private Boolean tracksNeededForCompletion;

    @Column(name = "condition_description")
    private String conditionDescription;

//    @ContainedIn
//    @OneToMany(mappedBy = "configuration")
//    private List<Product> products = new ArrayList<Product>();

    /**
     * Protected, no-argument constructor should only be used by persistence engine.
     */
    protected Configuration() {}

    public String getConfigKey() {
        return configKey;
    }

    public void setConfigKey(String configKey) {
        this.configKey = configKey;
    }

    public String getConfigName() {
        return configName;
    }

    public void setConfigName(String configName) {
        this.configName = configName;
    }

    public String getConfigShortName() {
        return configShortName;
    }

    public void setConfigShortName(String configShortName) {
        this.configShortName = configShortName;
    }

    public String getUpcConfigCode() {
        return upcConfigCode;
    }

    public void setUpcConfigCode(String upcConfigCode) {
        this.upcConfigCode = upcConfigCode;
    }

    public Integer getNoOfSides() {
        return noOfSides;
    }

    public void setNoOfSides(Integer noOfSides) {
        this.noOfSides = noOfSides;
    }

    public Boolean getHasScribeNo() {
        return hasScribeNo;
    }

    public void setHasScribeNo(Boolean hasScribeNo) {
        this.hasScribeNo = hasScribeNo;
    }

    public Boolean getIsDmdConfig() {
        return isDmdConfig;
    }

    public void setIsDmdConfig(Boolean isDmdConfig) {
        this.isDmdConfig = isDmdConfig;
    }

    public Boolean getHasXRate() {
        return hasXRate;
    }

    public void setHasXRate(Boolean hasXRate) {
        this.hasXRate = hasXRate;
    }

    public Boolean getCanBeCopyControlled() {
        return canBeCopyControlled;
    }

    public void setCanBeCopyControlled(Boolean canBeCopyControlled) {
        this.canBeCopyControlled = canBeCopyControlled;
    }

    public Boolean getIsDvdConfig() {
        return isDvdConfig;
    }

    public void setIsDvdConfig(Boolean isDvdConfig) {
        this.isDvdConfig = isDvdConfig;
    }

    public Boolean getIsEnhancedConfig() {
        return isEnhancedConfig;
    }

    public void setIsEnhancedConfig(Boolean isEnhancedConfig) {
        this.isEnhancedConfig = isEnhancedConfig;
    }

    public Boolean getIsSingleTrackConfig() {
        return isSingleTrackConfig;
    }

    public void setIsSingleTrackConfig(Boolean isSingleTrackConfig) {
        this.isSingleTrackConfig = isSingleTrackConfig;
    }

    public Boolean getCanBeCreatedManually() {
        return canBeCreatedManually;
    }

    public void setCanBeCreatedManually(Boolean canBeCreatedManually) {
        this.canBeCreatedManually = canBeCreatedManually;
    }

    public Boolean getCanBeGenerated() {
        return canBeGenerated;
    }

    public void setCanBeGenerated(Boolean canBeGenerated) {
        this.canBeGenerated = canBeGenerated;
    }

    public Boolean getTracksNeededForCompletion() {
        return tracksNeededForCompletion;
    }

    public void setTracksNeededForCompletion(Boolean tracksNeededForCompletion) {
        this.tracksNeededForCompletion = tracksNeededForCompletion;
    }

    public String getConditionDescription() {
        return conditionDescription;
    }

    public void setConditionDescription(String conditionDescription) {
        this.conditionDescription = conditionDescription;
    }

    public Configuration getGeneratesConfiguration() {
        return generatesConfiguration;
    }

    public void setGeneratesConfiguration(Configuration generatesConfiguration) {
        this.generatesConfiguration = generatesConfiguration;
    }

//    public MediaType getMediaType() {
//        return mediaType;
//    }
//
//    public void setMediaType(MediaType mediaType) {
//        this.mediaType = mediaType;
//    }

    public ConfigurationCategory getConfigurationCategory() {
        return configurationCategory;
    }

    public void setConfigurationCategory(ConfigurationCategory configurationCategory) {
        this.configurationCategory = configurationCategory;
    }

//    protected List<Product> getProducts() {
//        return products;
//    }
//
//    protected void setProducts(List<Product> products) {
//        this.products = products;
//    }

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

    @Override
    public boolean equals(Object obj) {
        if (this == obj)
            return true;
        if (obj == null)
            return false;
        if (getClass() != obj.getClass())
            return false;
        final Configuration other = (Configuration) obj;
        if (getConfigKey() == null) {
            if (other.getConfigKey() != null)
                return false;
        } else if (!getConfigKey().equals(other.getConfigKey()))
            return false;
        return true;
    }

}

