---
--- @package   eg4-crank-ui
--- @file      driver-display-settings.lua
--- @brief     Funtionality related to driver display settings
---
--- @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.                                              
---

local passcode_to_confirm
local current_passcode

---
--- @brief  Update the HTC hot key select icon enabled status
---
--- @param  gre#context mapargs
function CBUpdateHTCHotKeySelectIcon(mapargs)
  local control = "banner_icon_menu_layer.controls.htc_hot_key_control"
  local value = sbsettings.get_htc_hot_key_select_enable()
  gre.set_value(control..".grd_hidden", 1 - value)

  local value = sbsettings.get_htc_hot_key_icon()
  local selection = "htc_default"
  if value == 1 then
    selection = "audio_announcement"
  end
  gre.set_value(
    control..".image",      gre.get_value(control.."."..selection.."_up"),
    control..".image_down", gre.get_value(control.."."..selection.."_down"),
    control..".image_up",   gre.get_value(control.."."..selection.."_up"),
    "bd_select_htc_hot_key_id.banner_heading", gre.get_value("bd_select_htc_hot_key_id.heading_"..selection))
end

---
--- @brief  Sends event to update the default route code.  
--- @param  gre#context mapargs
---
function CBSetDefaultRouteCode(mapargs)
  if mapargs.value ~= nil then
    sbsettings.set_default_route_code(mapargs.value)
    SendEvent("settings_updated")
    TransitionBackScreen(mapargs)
  end
end

---
--- @brief  Sends event to update the default destination code.  
--- @param  gre#context mapargs
---
function CBSetDefaultDestinationCode(mapargs)
  if mapargs.value ~= nil then
    sbsettings.set_default_destination_code(mapargs.value)
    SendEvent("settings_updated")
    TransitionBackScreen(mapargs)
  end
end

---
--- @brief  Process driver ID entry enabled event
---
function CBUpdateDriverIDEnable(mapargs)
  SetHomeScreenIcon("logout_control", 
      (sbsettings.get_driver_id_entry() == 1 or 
       sbsettings.get_driver_passcode_required() == 1) and 0 or 1)
end

---
--- @brief  Process service ID settings event
---
function CBUpdateServiceIDSettings(mapargs)
  local value = mapargs.value or sbsettings.get_service_id_required()
  SetHomeScreenIcon("service_run_control", 1 - value)
end

---
--- @brief  Fetch extra keys for service ID event
---
function CBSetServiceIDExtraKeys(mapargs)
  gre.set_value("bd_service_id.extra_keys", sbsettings.get_service_id_valid_chars())
end


---
--- @brief  Sets which controls to show for maintenance password depending on qty of passwords available.
--- @param  value - true driver password is enabled
---
function UpdateDriverPasswordEdit(value)
  if value then
    gre.set_control_attrs("passwords_layer.menu_items.driver_add_password_control", { hidden = 0 })
    gre.set_control_attrs("passwords_layer.menu_items.driver_remove_password_control", { hidden = 0 })
    gre.set_control_attrs("passwords_layer.menu_items.driver_change_password_control", { hidden = 0 })
  else
    gre.set_control_attrs("passwords_layer.menu_items.driver_add_password_control", { hidden = 0 })
    gre.set_control_attrs("passwords_layer.menu_items.driver_remove_password_control", { hidden = 1 })
    gre.set_control_attrs("passwords_layer.menu_items.driver_change_password_control", { hidden = 1 })
  end
end

---
--- @brief  Sets which controls to show for maintenance password depending on qty of passwords available.
--- @param  value - number of passwords available
---
function UpdateMaintenancePasswordEdit(value)
  if value == 0 then
    gre.set_control_attrs("passwords_layer.menu_items.maintenance_add_password_control", { hidden = 0 })
    gre.set_control_attrs("passwords_layer.menu_items.maintenance_change_password_control", { hidden = 1 })
    gre.set_control_attrs("passwords_layer.menu_items.maintenance_remove_password_control", { hidden = 1 })
  elseif value == 1 then
    gre.set_control_attrs("passwords_layer.menu_items.maintenance_add_password_control", { hidden = 0 })
    gre.set_control_attrs("passwords_layer.menu_items.maintenance_change_password_control", { hidden = 0 })
    gre.set_control_attrs("passwords_layer.menu_items.maintenance_remove_password_control", { hidden = 1 })
  else
    gre.set_control_attrs("passwords_layer.menu_items.maintenance_add_password_control", { hidden = 0 })
    gre.set_control_attrs("passwords_layer.menu_items.maintenance_change_password_control", { hidden = 0 })
    gre.set_control_attrs("passwords_layer.menu_items.maintenance_remove_password_control", { hidden = 0 })
  end
end

---
--- @brief  Accept first value in adding a new maintenance password.
--- @param  gre#context mapargs
---
function CBPasscodeMaintenanceAdd(mapargs)
  if string.len(mapargs.value) > 0 then
    passcode_to_confirm = mapargs.value
    ScreenTransition("mo_passwords_maintenance_add_confirm")
  end
end

---
--- @brief  Confirm match and send to backend when adding a new maintenance 
---         password.
--- @param  gre#context mapargs
---
function CBPasscodeMaintenanceAddConfirm(mapargs)
  if mapargs.value == passcode_to_confirm then
    sbsettings.add_maintenance_password(mapargs.value)
    CBUpdatePasswordStatus()
    TransitionBackScreen(mapargs)
  else
    gre.set_control_attrs(mapargs.context_layer .. ".text_entry_group.text_entry_info_control", { hidden = 0})
  end
end

---
--- @brief Stores the entered value and validates password.   
---
function CBValidateMaintenanceOperatorPasswordForRemoval(mapargs)
  passcode_to_confirm = mapargs.value
  CBValidateMaintenanceOperatorPassword(mapargs)
end

---
--- @brief  Confirm match and send to backend when removing an existing 
---         maintenance password.
--- @param  gre#context mapargs
---
function CBPasscodeMaintenanceRemoveConfirm(mapargs)
  if mapargs.value == passcode_to_confirm then
    sbsettings.remove_maintenance_password(mapargs.value)
    CBUpdatePasswordStatus()
    TransitionBackScreen(mapargs)
  else
    gre.set_control_attrs(mapargs.context_layer .. ".text_entry_group.text_entry_info_control", { hidden = 0})
  end
end

---
--- @brief Stores the entered value and validates password.   
---
function CBValidateMaintenanceOperatorPasswordForChange(mapargs)
  current_passcode = mapargs.value
  CBValidateMaintenanceOperatorPassword(mapargs)
end

---
--- @brief  Accept first value in changing an existing maintenance password.
--- @param  gre#context mapargs
---
function CBPasscodeMaintenanceChangeNew(mapargs)
  if string.len(mapargs.value) > 0 then
    passcode_to_confirm = mapargs.value
    ScreenTransition("mo_passwords_maintenance_change_confirm")
  end
end

---
--- @brief  Confirm match and send to backend when changing an existing 
---         maintenance password.
--- @param  gre#context mapargs
---
function CBPasscodeMaintenanceChangeConfirm(mapargs)
  if mapargs.value == passcode_to_confirm then
    sbsettings.change_maintenance_password(current_passcode, mapargs.value)
    CBUpdatePasswordStatus()
    TransitionBackScreen(mapargs)
  else
    gre.set_control_attrs(mapargs.context_layer .. ".text_entry_group.text_entry_info_control", { hidden = 0})
  end
end

---
--- @brief  Accept first value in adding a new driver password.
--- @param  gre#context mapargs
---
function CBPasscodeDriverAdd(mapargs)
  if string.len(mapargs.value) > 0 then
    passcode_to_confirm = mapargs.value
    ScreenTransition("mo_passwords_driver_add_confirm")
  end
end

---
--- @brief  Confirm match and send to backend when adding a new driver 
---         password.
--- @param  gre#context mapargs
---
function CBPasscodeDriverAddConfirm(mapargs)
  if mapargs.value == passcode_to_confirm then
    sbsettings.add_driver_password(mapargs.value)
    CBUpdatePasswordStatus()
    TransitionBackScreen(mapargs)
  else
    gre.set_control_attrs(mapargs.context_layer .. ".text_entry_group.text_entry_info_control", { hidden = 0})
  end
end

---
--- @brief Stores the entered value and validates password.   
---
function CBValidateDriverPasswordForRemoval(mapargs)
  passcode_to_confirm = mapargs.value
  CBValidateDriverPassword(mapargs)
end

---
--- @brief  Confirm match and send to backend when removing an existing 
---         driver password.
--- @param  gre#context mapargs
---
function CBPasscodeDriverRemoveConfirm(mapargs)
  if mapargs.value == passcode_to_confirm then
    sbsettings.remove_driver_password(mapargs.value)
    CBUpdatePasswordStatus()
    TransitionBackScreen(mapargs)
  else
    gre.set_control_attrs(mapargs.context_layer .. ".text_entry_group.text_entry_info_control", { hidden = 0})
  end
end

---
--- @brief Stores the entered value and validates password.   
---
function CBValidateDriverPasswordForChange(mapargs)
  current_passcode = mapargs.value
  CBValidateDriverPassword(mapargs)
end

---
--- @brief  Accept first value in changing an existing driver password.
--- @param  gre#context mapargs
---
function CBPasscodeDriverChangeNew(mapargs)
  if string.len(mapargs.value) > 0 then
    passcode_to_confirm = mapargs.value  
    ScreenTransition("mo_passwords_driver_change_confirm")
  end
end

---
--- @brief  Confirm match and send to backend when changing an existing 
---         driver password.
--- @param  gre#context mapargs
---
function CBPasscodeDriverChangeConfirm(mapargs)
  if mapargs.value == passcode_to_confirm then
    sbsettings.change_driver_password(current_passcode, mapargs.value)
    CBUpdatePasswordStatus()
    TransitionBackScreen(mapargs)
  else
    gre.set_control_attrs(mapargs.context_layer .. ".text_entry_group.text_entry_info_control", { hidden = 0})
  end
end

---
--- @brief  Get the HTC hot key select items list
--- @param gre#context mapargs
function GetHtcHotKeySelectList()
  local list = sbsettings.get_htc_hot_key_select_list()
  table.sort(list, function(a, b) return tonumber(a) < tonumber(b) end)
  for i=1,#list do
    local text = sbsettings.get_htc_hot_key_select_list_item(list[i])
    if text ~= "" then
      list[i] = list[i].." - "..text
    end
  end
  return list
end

---
--- @brief  Initialise the HTC hot key selected screen
--- @param gre#context mapargs
function CBInitHtcHotKeySelect(mapargs)
  local list = GetHtcHotKeySelectList()

  if next(list) == nil then
    gre.set_layer_attrs_global("number_entry_layer", { hidden = 0 })
    CBResetTextEntry(mapargs)
    return
  end
  gre.set_layer_attrs_global("number_entry_layer", { hidden = 1 })

  local control = "htc_hot_key_select_list_layer.list"
  local data = {}
  local rows = 0
  for _,value in ipairs(list) do
    rows = rows + 1
    data[control..".text."..rows..".1"] = value
  end
  data[control..".grd_height"] = rows * gre.get_table_cell_attrs(control, 1, 1, "height").height
  gre.set_data(data)
  gre.set_table_attrs(control, { rows = rows })
end

---
--- @brief  Process the HTC hot key selected item
--- @param gre#context mapargs
function CBCellTouchHtcHotKeyItemSelected(mapargs)
  local text = gre.get_value(mapargs.context_control..".text."..mapargs.context_row..".1")
  local value = string.match(text, "%w+")
  if value ~= nil then
    for i = 1, #value do
      SendText("terminal_key_press", string.sub(value, i, i))
    end
  end
  TransitionBackScreen(mapargs)
end

---
--- @brief  HTC Hot key processing complete
--- @param gre#context mapargs
function CBHTCHotKeyComplete(mapargs) 
  TransitionBackScreen(mapargs)
end

---
--- @brief  Send HTC hot key to backend
--- @param gre#context mapargs
function CBHTCProcessHotKey(mapargs)
  if mapargs.context_event_data.code == nil then return end
  SendText("terminal_key_press", string.char(mapargs.context_event_data.code))
end

-- EOF --
 