---
--- @package   eg4-crank-ui
--- @file      wireless-data-manager-client.lua
--- @brief     Functionality related to the wireless data manager client screen
---
--- @copyright Copyright 2020 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  Collates the value and sends the settings update event.
--- @param  gre#context mapargs
---
function CBWriteWirelessDataManagerClientVehicleID(mapargs)
  sbsettings.set_wdmc_vehicle_id(mapargs.value)
  SendEvent("settings_updated")
  TransitionBackScreen(mapargs)
end

---
--- @brief  Collates the value and sends the settings update event.
--- @param  gre#context mapargs
---
function CBWriteWirelessDataManagerClientServerAddress(mapargs)
  sbsettings.set_wdmc_server_address(mapargs.value)
  SendEvent("settings_updated")
  TransitionBackScreen(mapargs)
end

---
--- @brief  Collates the value and sends the settings update event.
--- @param  gre#context mapargs
---
function CBWriteWirelessDataManagerClientUsername(mapargs)
  sbsettings.set_wdmc_username(mapargs.value)
  SendEvent("settings_updated")
  TransitionBackScreen(mapargs)
end

---
--- @brief  Collates the value and sends the settings update event.
--- @param  gre#context mapargs
function CBWriteWirelessDataManagerClientPassword(mapargs)
  sbsettings.set_wdmc_password(mapargs.value)
  SendEvent("settings_updated")
  TransitionBackScreen(mapargs)
end

---
--- @brief  Write download scheduler time of day
--- @param gre#context mapargs
function CBReadDownloadSchedulerTimeOfDay(mapargs)
  
  local time_of_day_start = sbsettings.get_wdmc_time_of_day_start()
  local time_of_day_end = sbsettings.get_wdmc_time_of_day_end()
  
  local context_layer = "time_of_day_start_and_end_layer"
 
  local data = {}
  data[context_layer..".value.text"] = sbsettings.get_wdmc_time_of_day_start_end()
  SetRow(data, context_layer..".start_hour.value", math.floor(time_of_day_start / 60) + 1)
  SetRow(data, context_layer..".start_minute.value", time_of_day_start % 60 + 1)
  SetRow(data, context_layer..".end_hour.value", math.floor(time_of_day_end / 60) + 1)
  SetRow(data, context_layer..".end_minute.value", time_of_day_end % 60 + 1)

  gre.set_data(data)
end

---
--- @brief  Write download scheduler time of day
--- @param gre#context mapargs
function CBWriteDownloadSchedulerTimeOfDay(mapargs)
  local start_hour = GetRow(mapargs.context_layer..".start_hour.value") - 1
  local start_minute = GetRow(mapargs.context_layer..".start_minute.value") - 1
  local end_hour = GetRow(mapargs.context_layer..".end_hour.value") - 1
  local end_minute = GetRow(mapargs.context_layer..".end_minute.value") - 1

  gre.set_value(mapargs.context_layer..".value.text", string.format("%02d:%02d - %02d:%02d", start_hour, start_minute, end_hour, end_minute))

  sbsettings.set_wdmc_time_of_day_start(start_hour * 60 + start_minute)
  sbsettings.set_wdmc_time_of_day_end(end_hour * 60 + end_minute)
  SendEvent("settings_updated")
end

---
--- @brief  Write Time of download interval
--- @param gre#context mapargs
function CBWriteDownloadInterval(mapargs)
  sbsettings.set_wdmc_download_interval(tonumber(mapargs.value))
  SendEvent("settings_updated")
  TransitionBackScreen(mapargs)
end

---
--- @brief Start add controller destination ID entry
--- @param gre#context mapargs
function CBStartAddControlledDestinationID(mapargs)
  gre.set_value("mo_network_wireless_data_manager_client_destination_ids_destination_code.selected_route_code", nil)
  if get_route_code_len() > 0 then
    ScreenTransition("mo_network_wireless_data_manager_client_destination_ids_route_code")
  else
    ScreenTransition("mo_network_wireless_data_manager_client_destination_ids_destination_code")
  end
end

---
--- @brief Route code entered for controlled destination ID
--- @param gre#context mapargs
function CBAddControlledDestinationIDRouteCode(mapargs)
  gre.set_value("mo_network_wireless_data_manager_client_destination_ids_destination_code.selected_route_code", mapargs.value)
  ScreenTransition("mo_network_wireless_data_manager_client_destination_ids_destination_code")
end

---
--- @brief Populate the controlled destination ID screen
--- @param gre#context mapargs
function CBPopulateControlledDestinationIDs(mapargs)
  local items = sbsettings.get_wdmc_controlled_destination_ids():split(",")
  local context_control = "download_scheduler_destination_ids_layer.destination_ids.items"

  local data = {}
  data[context_control..".grd_height"] = #items * 81
  for index=1,#items do
    data[context_control..".text."..index..".1"] = items[index]
  end
  gre.set_data(data)
  gre.set_table_attrs(context_control, { rows = #items })
end

---
--- @brief Destination code entered for controlled destination ID
--- @param gre#context mapargs
function CBAddControlledDestinationIDDestinationCode(mapargs)
  local route_code_value = gre.get_value("mo_network_wireless_data_manager_client_destination_ids_destination_code.selected_route_code") or "-1"
  local value = route_code_value.." "..mapargs.value
  sbsettings.add_wdmc_controlled_destination_id(value)
  SendEvent("settings_updated")
  TransitionBackScreen(mapargs)

  local control = "download_scheduler_destination_ids_layer.destination_ids.items"
  local data = {}
  local rows
  if gre.get_value(control..".grd_height") == 0 then
    rows = 1
  else
    rows = gre.get_value(control..".grd_rows") + 1
  end
  data[control..".text."..rows..".1"] = value
  data[control..".grd_height"] = rows * 81
  gre.set_table_attrs(control, {rows = rows})
  gre.set_data(data)
end

---
--- @brief Remove selected destination ID from controlled destination ID list
--- @param gre#context mapargs
function CBRemoveControlledDestinationID(mapargs)
  if ScrollActive() then return end

  -- Limit clear to end of item.
  if mapargs.context_event_data.x < gre.get_value(mapargs.context_control..".grd_x") + gre.get_value(mapargs.context_control..".grd_width") - 100 then return end

  local value = gre.get_value(mapargs.context_control..".text."..mapargs.context_row..".1")
  sbsettings.del_wdmc_controlled_destination_id(value)
  SendEvent("settings_updated")

  local data = {}
  local rows = gre.get_value(mapargs.context_control..".grd_rows") - 1
  for i = mapargs.context_row,rows do
    data[mapargs.context_control..".text."..i..".1"] = gre.get_value(mapargs.context_control..".text."..(i + 1)..".1")
  end
  data[mapargs.context_control..".grd_height"] = rows * 81
  gre.set_table_attrs(mapargs.context_control, {rows = rows})
  gre.set_data(data)
end

---
--- @brief  Collates the value and sends the settings update event.
--- @param  gre#context mapargs
---
function CBWriteWirelessDataManagerClientManifestFolder(mapargs)
  sbsettings.set_wdmc_manifest_folder(mapargs.value)
  SendEvent("settings_updated")
  TransitionBackScreen(mapargs)
end

---
--- @brief  Collates the value and sends the settings update event.
--- @param  gre#context mapargs
---
function CBWriteWirelessDataManagerClientPayloadFolder(mapargs)
  sbsettings.set_wdmc_payload_folder(mapargs.value)
  SendEvent("settings_updated")
  TransitionBackScreen(mapargs)
end

---
--- @brief  Collates the value and sends the settings update event.
--- @param  gre#context mapargs
---
function CBWriteWirelessDataManagerClientLogFolder(mapargs)
  sbsettings.set_wdmc_log_folder(mapargs.value)
  SendEvent("settings_updated")
  TransitionBackScreen(mapargs)
end

-- EOF --

