#include <Xm/Form.h>
#include <Xm/Frame.h>
#include <Xm/RowColumn.h>
#include <Xm/ToggleB.h>
#include <Xm/Label.h>
#include <Vk/VkErrorDialog.h>
#include "BenthicToolsled.h"
#include "DmErrno.h"
#include "toolsledDcon.h"
#include "powerDM.h"
#include "new_consoleDM.h"

extern "C" 
{
  DM_Item dm_get_connect(DM_Item item);
};


BenthicToolsled::BenthicToolsled(const char *name, Widget parent)
{
  _hydraulicSelect = 0;
  _packPower = 0;
  _switchMap = 0;
  _incandLight = 0;
  _manipulator = 0;
  _camera1 = 0;
  _camera2 = 0;

  _baseWidget = XtVaCreateWidget(name, xmFormWidgetClass, parent, 
				 XmNresizePolicy, XmRESIZE_GROW,
				 XmNfractionBase, 5,
				 NULL);

  installDestroyHandler();
  
  Widget selectLabel = 
    XtVaCreateManagedWidget("hydraulicSelectLabel", xmLabelWidgetClass,
			    _baseWidget, XmNtopAttachment, XmATTACH_FORM,
			    XmNleftAttachment, XmATTACH_FORM,
			    NULL);
  
  _hydraulicSelect = 
    new HydraulicSelect("hydraulicSelect", _baseWidget);
  
  XtVaSetValues(_hydraulicSelect->baseWidget(),
		XmNtopAttachment, XmATTACH_WIDGET,
		XmNtopWidget, selectLabel,
		XmNleftAttachment, XmATTACH_FORM,
		NULL);
  
  _hydraulicSelect->show();
  _hydraulicSelect->addCallback(HydraulicSelect::statusChangeCallback, this,
				(VkCallbackMethod )&BenthicToolsled::
				hydraulicCallback);

  char itemName[MaxDmNameLen];
  
  strcpy(itemName, POWER_DM_PREFIX);
  char *namePtr = itemName + strlen(itemName);
 
  strcpy(namePtr, VALVE_PACK_DM);
  
  _packPower = 
    new PowerSwitchGui("packPower", _baseWidget, itemName, 
		       "Valve Pack", 100, 50, 500, True);

  _packPower->addCallback(PowerSwitchGui::statusChangeCallback, this,
			 (VkCallbackMethod )&BenthicToolsled::
			 valvePackCallback);

  XtVaSetValues(_packPower->baseWidget(),
		XmNtopAttachment, XmATTACH_WIDGET,
		XmNtopWidget, selectLabel,
		XmNleftAttachment, XmATTACH_WIDGET,
		XmNleftWidget, _hydraulicSelect->baseWidget(),
		NULL);
  
  _packPower->show();

  Widget frame = 
    XtVaCreateManagedWidget("frame", xmFrameWidgetClass, _baseWidget, 
			    XmNtopAttachment, XmATTACH_WIDGET,
			    XmNtopWidget, _packPower->baseWidget(),
			    XmNleftAttachment, XmATTACH_FORM,
			    NULL);

  _valvePack = 
    XtVaCreateWidget("valvePack", xmRowColumnWidgetClass, frame,
		     XmNnumColumns, 3,
		     XmNpacking, XmPACK_COLUMN,
		     XmNorientation, XmHORIZONTAL,
		     NULL);

  strcpy(itemName, TOOLSLED_IBC_DM_PREFIX);
  namePtr = itemName + strlen(itemName);
  
  for (int i = 0; i < NValvePackValves; i++)
  {
    char valveName[256];
    sprintf(valveName, "valve%d", i);
    sprintf(namePtr, "VALVE_%d", i + 1);
    valves[i] = new ValveControl(valveName, _valvePack, itemName, i);
    valves[i]->show();
  }
  
  XtManageChild(_valvePack);

  _switchMap = new ValveSwitchMap("switchMap", _baseWidget, 3,
				  MAPPED_TOOLSLED_VALVE_DM,
				  NValvePackValves,
				  valves);

  XtVaSetValues(_switchMap->baseWidget(),
		XmNtopAttachment, XmATTACH_OPPOSITE_WIDGET,
		XmNtopWidget, frame,
		XmNleftAttachment, XmATTACH_WIDGET,
		XmNleftWidget, frame,
		NULL);		

  _switchMap->show();
  
  strcpy(itemName, POWER_DM_PREFIX);
  namePtr = itemName + strlen(itemName);

  strcpy(namePtr, INCAND_LAMP_DM);
  
  _incandLight = 
    new PowerSwitchGui("incandLight", _baseWidget, itemName,
		       "Incand Light", 100, 50, 500, True);
  
  XtVaSetValues(_incandLight->baseWidget(),
		XmNtopAttachment, XmATTACH_WIDGET,
		XmNtopWidget, frame,
		XmNleftAttachment, XmATTACH_FORM,
		NULL);
  
  _incandLight->show();

  strcpy(namePtr, MANIPULATOR_DM);

  _manipulator = 
    new PowerSwitchGui("manipulator", _baseWidget, itemName,
		       "Manipulator", 100, 50, 500, True);
  

  XtVaSetValues(_manipulator->baseWidget(),
		XmNtopAttachment, XmATTACH_OPPOSITE_WIDGET,
		XmNtopWidget, _incandLight->baseWidget(),
		XmNleftAttachment, XmATTACH_WIDGET,
		XmNleftWidget, _incandLight->baseWidget(),
		NULL);
  
  _manipulator->show();

  strcpy(namePtr, HP_VALVE_1A_DM);
  
  _camera1 = 
    new PowerSwitchGui("camera1", _baseWidget, itemName, 
		       "Camera 1", 100, 50, 500, True);
  
  XtVaSetValues(_camera1->baseWidget(),
		XmNtopAttachment, XmATTACH_OPPOSITE_WIDGET,
		XmNtopWidget, _incandLight->baseWidget(),
		XmNleftAttachment, XmATTACH_WIDGET,
		XmNleftWidget, _manipulator->baseWidget(),
		NULL);
  
  _camera1->show();

  strcpy(namePtr, HP_VALVE_1B_DM);

  _camera2 = 
    new PowerSwitchGui("camera2", _baseWidget, itemName, 
		       "Camera 2", 100, 50, 500, True);
  
  XtVaSetValues(_camera2->baseWidget(),
		XmNtopAttachment, XmATTACH_OPPOSITE_WIDGET,
		XmNtopWidget, _incandLight->baseWidget(),
		XmNleftAttachment, XmATTACH_WIDGET,
		XmNleftWidget, _camera1->baseWidget(),
		NULL);
  
  _camera2->show();

}


BenthicToolsled::~BenthicToolsled()
{
  delete _hydraulicSelect;
  delete _packPower;
  delete _switchMap;
  delete _incandLight;
  delete _manipulator;
  delete _camera1;
  delete _camera2;
}


void BenthicToolsled::valvePackCallback(VkCallbackObject *obj,
					void *clientData,
					void *callData)
{
  switchStatus status = (switchStatus )callData;
  switch (status)
  {
    case SWITCH_ON:
    case SWITCH_ON_CASCADE:
    XtSetSensitive(_valvePack, True);
    fprintf(stderr, "BenthicToolsled::valvePackCallback():\n"
	    "Ignoring hydraulicSelect mode for now!\n");

//    if (_hydraulicSelect->mode() == TOOLSLED_HYDRAULICS)
//      XtSetSensitive(_valvePack, True);

    break;
    
    default:
    XtSetSensitive(_valvePack, False);    
  }
}


void BenthicToolsled::valvePackOn(VkCallbackObject *obj,
				  void *clientData,
				  void *callData)
{
  XtSetSensitive(_valvePack, True);
}


void BenthicToolsled::valvePackOff(VkCallbackObject *obj,
				  void *clientData,
				  void *callData)
{
  XtSetSensitive(_valvePack, False);
}


void BenthicToolsled::hydraulicCallback(VkCallbackObject *obj,
					void *clientData,
					void *callData)
{
  // NOTE NOTE NOTE NOTE
  // Just return for now, until bottom-side hydraulic software is implemented
  fprintf(stderr, "BenthicToolsled::hydraulicCallback() - NOT IMPLEMENTED\n");
  return;
  
  vbPumpMode mode = (vbPumpMode )callData;
  switch (mode)
  {
    case TOOLSLED_HYDRAULICS:
    if (_packPower->status() == SWITCH_ON)
      // Activate valve controls
      XtSetSensitive(_valvePack, True);

    break;
    
    default:
    // De-activate valve controls
    XtSetSensitive(_valvePack, False);
  }
}

