package com.k_int.aggr2.mimsy.data.hdo;


import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GenerationType;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.Table;
import javax.persistence.Id;
import javax.persistence.GeneratedValue;

import org.hibernate.HibernateException;
import org.hibernate.Query;
import org.hibernate.Session;

@Entity
@Table(name="CIIM_GROUP_HIERARCHY")
public class GroupHierarchyXRTreeHDO //implements Serializable
{
	private static final long serialVersionUID = 1L;
	
	private String			tree_id;
	private MimsyCuratedGroupHDO 	curatedGroup;
	private Long			position;
	private Long			id;
	private Boolean			current = Boolean.TRUE;
	
	protected GroupHierarchyXRTreeHDO()
	{;}
	
	public GroupHierarchyXRTreeHDO(String tree_id, MimsyCuratedGroupHDO curatedGroup,Long pPosition)
	{
		this.tree_id = tree_id;
		this.curatedGroup = curatedGroup;
		this.position=pPosition;
	}
		
	@ManyToOne
	@JoinColumn(name="CIIM_CURATED_GROUP_FK")
	public MimsyCuratedGroupHDO getCuratedGroup()
	{
		return curatedGroup;
	}
	
	public void setCuratedGroup(MimsyCuratedGroupHDO curatedGroup) 
	{
		this.curatedGroup = curatedGroup;
	}

	@Column(name="TREE_ID")
	public String getTree_id() 
	{
		return tree_id;
	}

	public void setTree_id(String treeId) 
	{
		tree_id = treeId;
	}

	@Column(name="POSITION")
	public Long getPosition() 
	{
		return position;
	}

	public void setPosition(Long position)
	{
		this.position = position;
	}
	
	@Column(name="IS_CURRENT")
	public Boolean getCurrent() 
	{	
		if(current == null)
		{
			return new Boolean(true);
		}
		
		return current;
	}

	public void setCurrent(Boolean current)
	{
		this.current = current;
	}

	@Id	
	@Column(name="ID")
	@GeneratedValue(strategy = GenerationType.AUTO)
	public Long getId() 
	{
		return id;
	}

	protected void setId(Long id)
	{
		this.id = id;
	}
	
	public static GroupHierarchyXRTreeHDO lookupOrCreate(Session session, Long position, String tree_id, MimsyCuratedGroupHDO curatedGroup)
	{
		GroupHierarchyXRTreeHDO result = GroupHierarchyXRTreeHDO.lookupByTreeId(session, tree_id);
		
		if (result == null) 
		{
			try
			{
				result = new GroupHierarchyXRTreeHDO(tree_id, curatedGroup, position); 
				session.save(result);
				session.flush();				 
			}
			catch(Exception e)
			{
		 
			}			 
		}
		return result;
	}
	
	public static GroupHierarchyXRTreeHDO lookupByTreeId(Session session, String tree_id)
	{		
		if(tree_id == null)
		{
			return null;
		}
			
		try 
		{
			Query q = session.createQuery("Select x from com.k_int.aggr2.mimsy.data.hdo.GroupHierarchyXRTreeHDO x where x.tree_id = ?");
			q.setParameter(0, tree_id);
			
			return (GroupHierarchyXRTreeHDO) q.uniqueResult();
		}
		catch (HibernateException he) 
		{
			throw new HibernateException(he);
		}    
	}
	
	/*public static GroupHierarchyXRTreeHDO lookupOrCreate(Session session, String top_group_id, String gid, String tree_id, CuratedGroupHDO curatedGroup)
	{
		GroupHierarchyXRTreeHDO result = GroupHierarchyXRTreeHDO.lookupByTopGroupId(session, top_group_id, gid);
		
		if (result == null) 
		{
			try
			{
				result = new GroupHierarchyXRTreeHDO(tree_id, curatedGroup); 
				session.save(result);
				session.flush();				 
			}
			catch(Exception e)
			{
		 
			}			 
		}
		return result;
	}
	
	public static GroupHierarchyXRTreeHDO lookupByTopGroupId(Session session, String top_group_id, String gid)
	{		
		if(top_group_id==null)
		{
			throw new NullPointerException("top_group_id cannot be null");
		}
			
		try 
		{
			Query q = session.createQuery("Select x from com.k_int.aggr2.mimsy.data.GroupHierarchyXRTree x where x.curatedGroup.id = ? and x.tree_id like ?");
			q.setParameter(0, new Long(gid));
			q.setParameter(1, top_group_id + "%");
			
			return (GroupHierarchyXRTreeHDO) q.uniqueResult();
		}
		catch (HibernateException he) 
		{
			throw new HibernateException(he);
		}    
	}*/
}
