package com.k_int.aggr2.mimsy.data.hdo;

import java.io.Serializable;
import java.util.Date;
import java.util.HashSet;
import java.util.Set;

import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.EnumType;
import javax.persistence.Enumerated;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Inheritance;
import javax.persistence.InheritanceType;
import javax.persistence.JoinColumn;
import javax.persistence.JoinTable;
import javax.persistence.OneToMany;
import javax.persistence.OneToOne;
import javax.persistence.Table;

import org.hibernate.HibernateException;
import org.hibernate.Query;
import org.hibernate.Session;

import com.k_int.mimsy.ref.DataException;
import com.k_int.mimsy.ref.DataStatusEnum;
import com.k_int.mimsy.ref.MimsyDataTypeEnum;
import com.k_int.mimsy.ref.ObjectConformanceEnum;





@Entity
@Table(name="MIMSY_BASE_DATA")
@Inheritance(strategy=InheritanceType.JOINED)
public abstract class BaseMimsyDataHDO implements Serializable
{
	private static final long 		serialVersionUID = 1L;
	private Long					id;
	private Date 					last_updated;
	private MimsyDataTypeEnum 		type;
	private String 					mimsy_identifier;
	private ObjectConformanceEnum 	conformance;
	private Long					checksum;
	private Set<InstructionHDO> 	instructions = new HashSet<InstructionHDO>();
    private DataStatusEnum			status;
    private CIIMMasterContextHDO 	master_context;
    private String 					summary_title;
  
	protected BaseMimsyDataHDO()
	{;}
	
	protected BaseMimsyDataHDO(String mimsy_identifier,MimsyDataTypeEnum type,Date last_updated, ObjectConformanceEnum conformance)
	{
		this.type				= type;
		this.mimsy_identifier	= mimsy_identifier;
		this.last_updated 		= last_updated;
		this.conformance		= conformance;
	}
	
	@Id
	@Column(name="ID")
	@GeneratedValue(strategy=GenerationType.AUTO)
	public Long getId() 
	{
		return id;
	}
	
	protected void setId(Long id)
	{ 
		this.id = id;
	}
	
	@OneToOne(cascade=CascadeType.ALL)
	public CIIMMasterContextHDO getMasterContext()
	{
		return master_context;
	}
	
	public void setMasterContext(CIIMMasterContextHDO context)
	{
		this.master_context=context;
	}
	
	@Column(name="IDENTIFIER", length=255,unique=true)
	public String getMimsyIdentifier()
	{
		return mimsy_identifier;
	}
	
	protected void setMimsyIdentifier(String mimsy_identifier)
	{
		this.mimsy_identifier=mimsy_identifier;
	}
	
	public void setSummaryTitle(String summary_title)
    {
    	this.summary_title=summary_title;
    }
    
    @Column(name="SUMMARY_TITLE", length=2000)
    public String getSummaryTitle()
    {   
    	return summary_title;
    }

	protected void setDataType(MimsyDataTypeEnum type)
	{
		this.type=type;
	}
	
	public void setLastUpdated(Date last_updated)
	{
		this.last_updated=last_updated;
	}
	
	public void setChecksum(Long checksum)
	{
		this.checksum=checksum;
	}
	
	@Column(name="CHECKSUM",unique=true)
	public Long getChecksum()
	{
		return checksum;
	}

	@Column(name="DATA_TYPE")
	@Enumerated(EnumType.ORDINAL)
	public MimsyDataTypeEnum getDataType()
	{
		return type;
	}

	@Column(name = "CONFORMANCE")
	@Enumerated(EnumType.ORDINAL)
	public ObjectConformanceEnum getConformance()
	{
		return conformance;
	}
	
	public void setConformance(ObjectConformanceEnum conformance)
	{
		this.conformance=conformance;
	}
	
	@Column(name = "DATA_STATUS")
	@Enumerated(EnumType.ORDINAL)
	public DataStatusEnum getDataStatus()
	{
		return status;
	}
	
	public void setDataStatus(DataStatusEnum status)
	{
		this.status=status;
	}
	
	@Column(name="LAST_UPDATED")
	public Date getLastUpdated()
	{
		return last_updated;
	}
	
	 @OneToMany(cascade=CascadeType.ALL)
	 @JoinTable(name="MIMSY_INSTR_LINK",
	         joinColumns=@JoinColumn(name="MIMSY_DATA_FK", referencedColumnName="ID"),
	         inverseJoinColumns= @JoinColumn(name="INSTRUCTION_FK", referencedColumnName="ID"))
	public Set<InstructionHDO> getInstructions()
	{
		return instructions;
	}
	
	public void setInstructions(Set<InstructionHDO> instructions)
	{
		this.instructions = instructions;
	}
	
	    
    public static BaseMimsyDataHDO lookup(Session sess, String mimsy_identifier) throws DataException
    {
    	try 
		{
		 	Query q = sess.createQuery("select x from com.k_int.aggr2.mimsy.data.hdo.BaseMimsyDataHDO x where x.mimsyIdentifier=:mimsyIdentifier");
		 	q= q.setParameter("mimsyIdentifier", mimsy_identifier);		  
	 
		 	return (BaseMimsyDataHDO)q.uniqueResult();
		}
		catch (HibernateException he) 
		{
			throw new DataException(he);
		}    
    }
    
    //clear instructions but leave everything else intact in this class.
    public void clear()
    {
    	instructions = null;
    }

}
