---
-- @package   eg4-crank-ui
-- @file      toggle-control.lua
-- @brief     Functionality supporting toggle controls
--
-- @copyright Copyright 2019 Hanover Displays Limited.
-- @license   This program is the confidential and proprietary product of
--            Hanover Displays Limited. Any unauthorised use, reproduction or
--            transfer of this program is strictly prohibited. (Subject to 
--            limited distribution and restricted disclosure only.) All 
--            rights reserved.                                              
--
--

---
--- @brief  Callback to toggles the touched control.
--- @param  gre#context mapargs
---
function CBToggleControl(mapargs) 
  if ScrollActive ~= nil and ScrollActive() then
    return
  end
  local control = mapargs.context_control
  local data = gre.get_data(control .. ".start",
                            control .. ".align")

  data[control .. ".start"] = -data[control .. ".start"]
  if data[control .. ".align"] == 1 then
    data[control .. ".align"] = 3
    mapargs.value = 1
  else
    data[control .. ".align"] = 1
    mapargs.value = 0
  end
  
  gre.set_data(data)

  -- Get port id from parameter, group, or screen
  mapargs.port_id = mapargs.port_id or gre.get_value(mapargs.context_group..".port_id") or gre.get_value(mapargs.context_screen..".port_id")

  -- Check if a set function exists for this component.
  local fn = mapargs.context_control:split(".")
  fn = "set_"..fn[#fn]:sub(1,-8)
  fn = _G[fn] or sbsettings[fn]
  if fn then
    fn(mapargs.value, mapargs.port_id)
  end

  -- If specified, run callback
  local callback = _G[mapargs.callback] or _G[gre.get_value(control .. ".callback")]
  if type(callback) == "function" then 
    callback(mapargs)
  end

  -- If specified, send event to backend
  local event = mapargs.event or gre.get_value(control .. ".event")
  if event then
    SendEvent(event)
  end
end

---
--- @brief  Sets the toggle control the required value.
--- @param  control - control to update
--- @param  value - value to write, or nil to read from settings
---
function SetToggleControlValue(context_control, value)
  local data = gre.get_data(context_control .. ".start",
                            context_control .. ".align")
  if value == 1 or value == true then
    data[context_control .. ".start"] = -math.abs(tonumber(data[context_control .. ".start"]))
    data[context_control .. ".align"] = 3
  else
    data[context_control .. ".start"] = math.abs(tonumber(data[context_control .. ".start"]))
    data[context_control .. ".align"] = 1
  end
  gre.set_data(data)
end

---
--- @brief  Gets the toggle control value.
--- @param  gre#context mapargs
---
function GetToggleControlValue(context_control)
  return gre.get_value(context_control .. ".align") ~= 1
end

---
--- @brief  Sets the toggle control the required value from a callback.
--- @param  gre#context mapargs
---
function CBSetToggleControlValue(mapargs)
  SetToggleControlValue(mapargs.toggle, tonumber(mapargs.value))
end

---
--- @brief  Default callback function for toggle control value change.
--- @param  gre#context mapargs
---
function CBTestToggleControl(mapargs)
  print(mapargs.value) 
end

-- EOF --
