
--[[
  @package    eg4-crank-ui-2
  @file       sign-firmware-update.lua
  @brief      Handles sign firmware update interactions
]]

-- Map of firmware variants to filepaths
local firmware_variants = {}

---
--- @brief  Checkbox guard to ensure that firmware binary is available when trying to check.
--- @param gre#context mapargs
--- @return true if the firmware binary is available
function cb_check_sign_firmware_valid(mapargs)
  local value = gre.get_value(mapargs.context_control .. ".value" .. "." .. mapargs.context_row .. ".1")
  return firmware_variants[value] ~= nil
end

---
--- @brief  Initialise the firmware select screen for a specific sign.
--- @param gre#context mapargs
function cb_init_select_sign_firmware(mapargs)
  local cell = mapargs.context_control..".%s."..tostring(mapargs.context_row)..".1"
  local sign_firmware_cell = string.format(cell, "value")
  local init = {
    set = function (value) gre.set_value(sign_firmware_cell, value) end,
    as_value = 1,
    value = gre.get_value(sign_firmware_cell),
    heading = gre.get_value(string.format(cell, "text")),
    list = {},
  }

  for firmware_variant,_ in pairs(firmware_variants) do
    table.insert(init.list, firmware_variant)
  end

  start_radio_select(init)
end

---
--- @brief  Send the selected sign firmware filenames and endpoints to the backend.
--- @param gre#context mapargs
function cb_submit_select_sign_firmware_updates(mapargs)
  local control = get_list_control(mapargs.context_screen)
  local rows = gre.get_table_attrs(control, "rows" ).rows or 0

  local text = ""
  local sep = ""
  for row=1,rows do
    local cell = control..".%s."..tostring(row)..".1"
    local filepath = firmware_variants[gre.get_value(string.format(cell, "value"))]
    if filepath and gre.get_value(string.format(cell, "checked")) ~= 0 then
      text = text..sep..gre.get_value(string.format(cell, "data"))..","..filepath
      sep = "\n"
    end
  end

  if text == "" then
    notify("no_sign_updates_selected")
  end
  send_event("sign_firmware_updates_selected", text)
  screen_transition_idle()
end

---
--- @brief  Populate the sign firmware update screen with known signs.
--- @param gre#context mapargs
function cb_start_select_sign_firmware_updates(mapargs)
  if not mapargs.context_event_data.text then return end

  firmware_variants = {}
  for _,line in ipairs(mapargs.context_event_data.text:lines()) do
    local items = line:split(",")
    if #items == 2 then
      firmware_variants[items[1]:upper()] = items[2]
    end
  end

  -- Collect known sign information.
  local signs = get_connected_signs_list()
  if #signs == 0 then
    send_event("sign_firmware_updates_selected", "")
    return
  end

  -- Sort the matched table.
  table.sort(signs,
    function(a, b)
      a = a.equipment_name or ""
      b = b.equipment_name or ""
      return a < b
    end)

  -- Populate list for the checkbox selection
  mapargs.list = {}
  for row, item in ipairs(signs) do
    table.insert(mapargs.list, {
      text = item.equipment_name,
      value = item.variant_name or "",
      data = string.format("%s,%s,%s", item.end_point.trunk, item.end_point.channel or "", item.end_point.device_id),
      checked = firmware_variants[item.variant_name] and 1 or 0
    })
  end

  start_checkbox_list(mapargs)
  cb_set_mode_maintenance()
end

