/******************************************************************************
  Copyright (C) 2017 Adaxa Pty Ltd. All Rights Reserved.                
  This program is free software; you can redistribute it and/or modify it    
  under the terms version 2 of the GNU General Public License as published   
  by the Free Software Foundation. This program is distributed in the hope   
  that it will be useful, but WITHOUT ANY WARRANTY; without even the implied 
  warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 *****************************************************************************/

package org.compiere.model;

import java.sql.ResultSet;
import java.util.Properties;

import org.adempiere.exceptions.AdempiereException;
import org.compiere.util.DB;
import org.compiere.util.Env;
import org.compiere.util.Msg;

/**
 * Favorite Tree Node Model
 * 
 * @author Logilite Technologies
 * @since  June 20, 2017
 */
public class MTreeFavoriteNode extends X_AD_Tree_Favorite_Node
{

	/**
	 * generated serial id
	 */
	private static final long	serialVersionUID		= -1085269880909860587L;

	public static final String	SQL_CHECK_MENU_EXISTS	= "SELECT CASE WHEN COUNT(AD_Menu_ID) > 0 THEN 'Y' ELSE 'N' END FROM AD_Tree_Favorite_Node WHERE AD_Tree_Favorite_ID=? AND NVL(Parent_ID, 0)=? AND AD_Menu_ID=?";

    /**
     * UUID based Constructor
     * @param ctx  Context
     * @param AD_Tree_Favorite_Node_UU  UUID key
     * @param trxName Transaction
     */
    public MTreeFavoriteNode(Properties ctx, String AD_Tree_Favorite_Node_UU, String trxName) {
        super(ctx, AD_Tree_Favorite_Node_UU, trxName);
    }

	/**
	 * @param ctx
	 * @param AD_Tree_Favorite_Node_ID
	 * @param trxName
	 */
	public MTreeFavoriteNode(Properties ctx, int AD_Tree_Favorite_Node_ID, String trxName)
	{
		super(ctx, AD_Tree_Favorite_Node_ID, trxName);
	}

	/**
	 * @param ctx
	 * @param rs
	 * @param trxName
	 */
	public MTreeFavoriteNode(Properties ctx, ResultSet rs, String trxName)
	{
		super(ctx, rs, trxName);
	}

	/**
	 * Check the Menu ID is Present on specified Parent id or not
	 * 
	 * @param  menuID    - AD_Menu_ID
	 * @param  nodeID    - Parent Node_ID
	 * @param  treeFavID - AD_Tree_Favorite_ID
	 * @return True if menuID exists
	 */
	public static boolean isMenuExists(int menuID, int nodeID, int treeFavID)
	{
		return "Y".equalsIgnoreCase(DB.getSQLValueStringEx(null, SQL_CHECK_MENU_EXISTS, treeFavID, nodeID, menuID));
	} // isMenuExists

	/**
	 * Get Favourite node for the menu
	 * 
	 * @param  AD_Tree_Favorite_ID
	 * @param  Menu_ID
	 * @return {@link MTreeFavoriteNode} or null
	 */
	public static MTreeFavoriteNode getFavouriteTreeNodeFromMenuID(int AD_Tree_Favorite_ID, int Menu_ID)
	{
		Query query = new Query(Env.getCtx(), MTreeFavoriteNode.Table_Name, "AD_Tree_Favorite_ID=? AND AD_Menu_ID=? AND IsFavourite='Y' AND AD_Client_ID IN (0,?)", null);
		query.setOnlyActiveRecords(true);
		query.setParameters(new Object[] { AD_Tree_Favorite_ID, Menu_ID, Env.getAD_Client_ID(Env.getCtx()) });
		return query.first();
	} // getFavouriteTreeNodeFromMenuID

	/**
	 * Create and save tree favorite node
	 * 
	 * @param  AD_Client_ID
	 * @param  AD_Org_ID
	 * @param  AD_Tree_Favorite_ID
	 * @param  AD_Menu_ID
	 * @param  Parent_ID
	 * @param  SeqNo
	 * @param  folderName
	 * @param  isSummary
	 * @param  isCollapsible
	 * @param  isFavourite
	 * @return new {@link MTreeFavoriteNode} instance
	 */
	public static MTreeFavoriteNode create(	int AD_Client_ID, int AD_Org_ID, int AD_Tree_Favorite_ID, int AD_Menu_ID, int Parent_ID, int SeqNo,
											String folderName, boolean isSummary, boolean isCollapsible, boolean isFavourite)
	{
		MTreeFavoriteNode favNode = (MTreeFavoriteNode) MTable.get(Env.getCtx(), MTreeFavoriteNode.Table_ID).getPO(0, null);
		favNode.set_ValueOfColumn(I_AD_Tree_Favorite_Node.COLUMNNAME_AD_Client_ID, AD_Client_ID);
		favNode.setAD_Org_ID(AD_Org_ID);
		favNode.setAD_Tree_Favorite_ID(AD_Tree_Favorite_ID);
		favNode.setAD_Menu_ID(AD_Menu_ID);
		favNode.setParent_ID(Parent_ID);
		favNode.setSeqNo(SeqNo);
		if (isSummary)
			favNode.setName(folderName);
		favNode.setIsSummary(isSummary);
		favNode.setIsCollapsible(isCollapsible);
		favNode.setIsFavourite(isFavourite);
		if (!favNode.save())
		{
			throw new AdempiereException(Msg.getMsg(Env.getCtx(), "NodeNotCreate"));
		}

		return favNode;
	} // create
}
