package com.k_int.aggr2.mimsy.data.hdo;

import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;

import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.JoinTable;
import javax.persistence.Lob;
import javax.persistence.ManyToMany;
import javax.persistence.ManyToOne;
import javax.persistence.Table;

import org.hibernate.HibernateException;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.annotations.Cascade;
import org.hibernate.annotations.MapKeyManyToMany;

@Entity
@Table(name="CIIM_GROUP_CONTEXT")
public class CIIMGroupContextHDO 
{
	private Long id;
	private String longDescription;
	private Set<CIIMMediaDescriptionHDO> media = new HashSet<CIIMMediaDescriptionHDO>();
	private SchemaDefinitionHDO schema;
	private SchemaDefinitionHDO object_schema;
	private Map<SchemaElementHDO, SchemaOptionValueHDO> options = new HashMap<SchemaElementHDO, SchemaOptionValueHDO>(); 
	
	protected CIIMGroupContextHDO()
	{;}
	
	@Id
	@Column(name="ID")
	@GeneratedValue(strategy=GenerationType.AUTO)
	public Long getId()
	{
		return this.id;
	}
	
	protected void setId(Long id)
	{
		this.id = id;
	}
	
	public void setMedia(Set<CIIMMediaDescriptionHDO> media)
	{
		this.media = media;
	}
	
	@ManyToMany(cascade=CascadeType.ALL, fetch=FetchType.EAGER)
	@JoinTable(name="CIIM_GROUP_CONTEXT_MEDIA_LINK",
	         joinColumns=@JoinColumn(name="CIIM_GROUP_CONTEXT_FK", referencedColumnName="ID"),
	         inverseJoinColumns= @JoinColumn(name="MEDIA_FK", referencedColumnName="ID"))         
	public Set<CIIMMediaDescriptionHDO> getMedia()
	{
		return media;
	}
	
	public void setLongDescription(String longDescription)
	{
		this.longDescription=longDescription;
	}
	
	@Lob
	@Column(name="LONG_DESCRIPTION", length=Integer.MAX_VALUE - 1)
	public String getLongDescription()
	{
		return longDescription;
	}
	
	@ManyToOne(fetch=FetchType.LAZY)
	@JoinColumn(name="SCHEMA_DEFINITION_FK")
	public SchemaDefinitionHDO getSchema() 
	{
		return schema;
	}

	public void setSchema(SchemaDefinitionHDO schema) 
	{
		this.schema = schema;
	}	
	
	@ManyToOne(fetch=FetchType.LAZY)
	@JoinColumn(name="OBJECT_SCHEMA_DEFINITION_FK")
	public SchemaDefinitionHDO getObjectSchema() 
	{
		return object_schema;
	}

	public void setObjectSchema(SchemaDefinitionHDO object_schema) 
	{
		this.object_schema = object_schema;
	}
	
	@ManyToMany
	@JoinTable(name = "GROUP_CONTEXT_SCHEMA_VALUES_LINK")	
	@MapKeyManyToMany(targetEntity=SchemaElementHDO.class, joinColumns = @JoinColumn(name="options_KEY"))
	@Cascade({org.hibernate.annotations.CascadeType.SAVE_UPDATE, org.hibernate.annotations.CascadeType.DELETE_ORPHAN})
	public Map<SchemaElementHDO, SchemaOptionValueHDO> getOptions() 
	{
	    return options;
	}
	
	public void setOptions(Map<SchemaElementHDO, SchemaOptionValueHDO> options) 
	{
	    this.options = options;
	}

	public static CIIMGroupContextHDO lookupOrCreate(Session session, Long id)
	{
		CIIMGroupContextHDO result = CIIMGroupContextHDO.lookupById(session, id);
		
		if (result == null) 
		{
			try
			{
				result = new CIIMGroupContextHDO(); 
				session.save(result);
				session.flush();				 
			}
			catch(Exception e)
			{
		 
			}			 
		}
		return result;
	}
	
	public static CIIMGroupContextHDO lookupById(Session session, Long id)
	{		
		if(id == null)
		{
			return null;
		}
			
		try 
		{
			Query q = session.createQuery("Select x from com.k_int.aggr2.mimsy.data.hdo.CIIMGroupContextHDO x where x.id = ?");
			q.setLong(0, id);
			
			return (CIIMGroupContextHDO) q.uniqueResult();
		}
		catch (HibernateException he) 
		{
			throw new HibernateException(he);
		}    
	}
}
