package jbCAP;

import jVARIANT.VARIANT;
import jVARIANT.VARENUM;
import java.util.Arrays;

/** @file bCapController.java
 *
 *  @brief b-CAP client library
 *
 *  @version	1.2
 *	@date		2014/5/26
 *	@author		DENSO WAVE (m)
 *
 */
public class bCapController extends bCapObjectTmpl{
	private bCapExtensions m_exts;
	private bCapFiles m_files;
	private bCapRobots m_robots;
	private bCapTasks m_tasks;
	private bCapVariables m_vars;
	private bCapCommands m_cmds;
	
	protected bCapController(int iHandle, bCapSocket sock)
	{
		m_hr = 0;
		m_iHandle = iHandle;
		m_iOffset = 19;
		
		m_bCapSock = sock;
		
		m_exts = new bCapExtensions(m_iHandle, m_bCapSock);
		m_files = new bCapFiles(m_iHandle, m_bCapSock, 0);
		m_robots = new bCapRobots(m_iHandle, m_bCapSock);
		m_tasks = new bCapTasks(m_iHandle, m_bCapSock);
		m_vars = new bCapVariables(m_iHandle, m_bCapSock, 0);
		m_cmds = new bCapCommands(m_iHandle, m_bCapSock);
	}
	
	@Override
	protected void Disconnect()
	{
		// Clear bCap Objects
		m_exts.Clear();
		m_files.Clear();
		m_robots.Clear();
		m_tasks.Clear();
		m_vars.Clear();
		m_cmds.Clear();
		
		// Disconnect bCapController
		bCapPacket msg = new bCapPacket();
		msg.m_ID = 4; // Controller_Disconnect
		
		VARIANT vnt = new VARIANT(VARENUM.VT_I4, m_iHandle);			
		msg.m_vntArray.add(vnt);
		
		msg = m_bCapSock.SendMessage(msg);
		
		m_hr = msg.m_ID;
		
		m_bCapSock.Release();
	}
	
	public VARIANT get_ExtensionNames(String strOption)
	{
		VARIANT vntReturn = new VARIANT();
		
		bCapPacket msg = new bCapPacket();
		msg.m_ID = 11; // Controller_GetExtensionNames
		
		VARIANT vnt[] = new VARIANT[2];
		vnt[0] = new VARIANT(VARENUM.VT_I4, m_iHandle);
		vnt[1] = new VARIANT(VARENUM.VT_BSTR, strOption);
		msg.m_vntArray.addAll(Arrays.asList(vnt));
		
		msg = m_bCapSock.SendMessage(msg);
		
		m_hr = msg.m_ID;
		
		if(msg.m_vntArray.size() == 1)
		{
			vntReturn = msg.m_vntArray.get(0);
		}
		
		return vntReturn;		
	}
	
	public bCapExtensions get_Extensions()
	{
		return m_exts;
	}
	
	public VARIANT get_FileNames(String strOption)
	{
		VARIANT vntReturn = new VARIANT();
		
		bCapPacket msg = new bCapPacket();
		msg.m_ID = 12; // Controller_GetFileNames
		
		VARIANT vnt[] = new VARIANT[2];
		vnt[0] = new VARIANT(VARENUM.VT_I4, m_iHandle);
		vnt[1] = new VARIANT(VARENUM.VT_BSTR, strOption);
		msg.m_vntArray.addAll(Arrays.asList(vnt));
		
		msg = m_bCapSock.SendMessage(msg);
		
		m_hr = msg.m_ID;
		
		if(msg.m_vntArray.size() == 1)
		{
			vntReturn = msg.m_vntArray.get(0);
		}
		
		return vntReturn;		
	}
	
	public bCapFiles get_Files()
	{
		return m_files;
	}
	
	public VARIANT get_RobotNames(String strOption)
	{
		VARIANT vntReturn = new VARIANT();
		
		bCapPacket msg = new bCapPacket();
		msg.m_ID = 13; // Controller_GetRobotNames
		
		VARIANT vnt[] = new VARIANT[2];
		vnt[0] = new VARIANT(VARENUM.VT_I4, m_iHandle);
		vnt[1] = new VARIANT(VARENUM.VT_BSTR, strOption);
		msg.m_vntArray.addAll(Arrays.asList(vnt));
		
		msg = m_bCapSock.SendMessage(msg);
		
		m_hr = msg.m_ID;
		
		if(msg.m_vntArray.size() == 1)
		{
			vntReturn = msg.m_vntArray.get(0);
		}
		
		return vntReturn;		
	}
	
	public bCapRobots get_Robots()
	{
		return m_robots;
	}
	
	public VARIANT get_TaskNames(String strOption)
	{
		VARIANT vntReturn = new VARIANT();
		
		bCapPacket msg = new bCapPacket();
		msg.m_ID = 14; // Controller_GetTaskNames
		
		VARIANT vnt[] = new VARIANT[2];
		vnt[0] = new VARIANT(VARENUM.VT_I4, m_iHandle);
		vnt[1] = new VARIANT(VARENUM.VT_BSTR, strOption);
		msg.m_vntArray.addAll(Arrays.asList(vnt));
		
		msg = m_bCapSock.SendMessage(msg);
		
		m_hr = msg.m_ID;
		
		if(msg.m_vntArray.size() == 1)
		{
			vntReturn = msg.m_vntArray.get(0);
		}
		
		return vntReturn;		
	}
	
	public bCapTasks get_Tasks()
	{
		return m_tasks;
	}
	
	public VARIANT get_VariableNames(String strOption)
	{
		VARIANT vntReturn = new VARIANT();
		
		bCapPacket msg = new bCapPacket();
		msg.m_ID = 15; // Controller_GetVariableNames
		
		VARIANT vnt[] = new VARIANT[2];
		vnt[0] = new VARIANT(VARENUM.VT_I4, m_iHandle);
		vnt[1] = new VARIANT(VARENUM.VT_BSTR, strOption);
		msg.m_vntArray.addAll(Arrays.asList(vnt));
		
		msg = m_bCapSock.SendMessage(msg);
		
		m_hr = msg.m_ID;
		
		if(msg.m_vntArray.size() == 1)
		{
			vntReturn = msg.m_vntArray.get(0);
		}
		
		return vntReturn;		
	}
	
	public bCapVariables get_Variables()
	{
		return m_vars;
	}
	
	public VARIANT get_CommandNames(String strOption)
	{
		VARIANT vntReturn = new VARIANT();
		
		bCapPacket msg = new bCapPacket();
		msg.m_ID = 16; // Controller_GetCommandNames
		
		VARIANT vnt[] = new VARIANT[2];
		vnt[0] = new VARIANT(VARENUM.VT_I4, m_iHandle);
		vnt[1] = new VARIANT(VARENUM.VT_BSTR, strOption);
		msg.m_vntArray.addAll(Arrays.asList(vnt));
		
		msg = m_bCapSock.SendMessage(msg);
		
		m_hr = msg.m_ID;
		
		if(msg.m_vntArray.size() == 1)
		{
			vntReturn = msg.m_vntArray.get(0);
		}
		
		return vntReturn;		
	}
	
	public bCapCommands get_Commands()
	{
		return m_cmds;
	}
	
	public bCapExtension AddExtension(String strName, String strOption)
	{	
		bCapExtension ext = m_exts.Add(strName, strOption);
		m_hr = m_exts.HRESULT();
		
		return ext;
	}
	
	public bCapFile AddFile(String strName, String strOption)
	{
		bCapFile file = m_files.Add(strName, strOption);
		m_hr = m_files.HRESULT();
		
		return file;
	}
	
	public bCapRobot AddRobot(String strName, String strOption)
	{
		bCapRobot robot = m_robots.Add(strName, strOption);
		m_hr = m_robots.HRESULT();
		
		return robot;
	}
		
	public bCapTask AddTask(String strName, String strOption)
	{
		bCapTask task = m_tasks.Add(strName, strOption);
		m_hr = m_tasks.HRESULT();
		
		return task;
	}
		
	public bCapVariable AddVariable(String strName, String strOption)
	{	
		bCapVariable var = m_vars.Add(strName, strOption);
		m_hr = m_vars.HRESULT();
		
		return var;
	}
	
	public bCapCommand AddCommand(String strName, String strOption)
	{	
		bCapCommand cmd = m_cmds.Add(strName, strOption);
		m_hr = m_cmds.HRESULT();
		
		return cmd;
	}
	
	public bCapMessage GetMessage(){
		bCapPacket msg = new bCapPacket();
		msg.m_ID = 18; // Controller_GetMessage
		
		VARIANT vnt = new VARIANT(VARENUM.VT_I4, m_iHandle);
		msg.m_vntArray.add(vnt);
		
		msg = m_bCapSock.SendMessage(msg);
		
		if(msg.m_vntArray.size() == 1 && msg.m_vntArray.get(0).VariantGetType() == VARENUM.VT_I4){
			return new bCapMessage((Integer)msg.m_vntArray.get(0).VariantGetObject(), m_bCapSock);
		}else{
			return null;
		}
	}
	
	public VARIANT Execute(String strCommand, VARIANT vntParam)
	{
		VARIANT vntReturn = new VARIANT();
		
		bCapPacket msg = new bCapPacket();
		msg.m_ID = 17; // Controller_Execute
		
		VARIANT vnt[] = new VARIANT[3];
		vnt[0] = new VARIANT(VARENUM.VT_I4, m_iHandle);
		vnt[1] = new VARIANT(VARENUM.VT_BSTR, strCommand);
		vnt[2] = vntParam != null ? vntParam : new VARIANT();
		msg.m_vntArray.addAll(Arrays.asList(vnt));

		msg = m_bCapSock.SendMessage(msg);
		
		m_hr = msg.m_ID;

		if(msg.m_vntArray.size() == 1)
		{
			vntReturn = msg.m_vntArray.get(0);
		}

		return vntReturn;
	}
}
