--[[
  @package    eg4-crank-ui
  @file       state-of-charge.lua
  @brief      Supports the state of charge features and notifications
]]

--[[
./iogen g4_frontend - state_of_charge 1s0:text "return { active = true, info_code = '00', charge_level='90%' }"
]]

local TILE = "state_of_charge_group"
local NOTIFICATION = "state_of_charge_no_data"
local info = {}

---
-- @brief  Updates the state of charge icon.
--
function UpdateStateOfChargeIcon() 
  SetHomeScreenIcon("state_of_charge_control", sbsettings.check_can_protocol_active("STATE-OF-CHARGE") and 0 or 1)
end

---
--- @brief  Process state of charge info code template update
--- @param  gre#context mapargs
function cb_process_state_of_charge(mapargs)
  local data = loadstring(mapargs.context_event_data.text)()
  info.data = data
  local message = sbsettings.get_state_of_charge_driver_message(data.info_code) or ""
  if data.active then
    if message ~= "" then
      if data.charge_level then
        local specifier = sbsettings.get_state_of_charge_driver_specifier()
        if specifier ~= "" then
          -- Uses gsub to fix up issue with single %
          message = message:gsub(specifier, (data.charge_level == "") and "??" or data.charge_level:gsub("%%", "%%%%"))
        end
      end
      gre.set_value("home_tiles_layer."..TILE..".message.text", message)
      ActivateTile(TILE)
      CBCloseNotification({context_group = info.notification_group, context_layer = "notification_layer"})
      info.notification_group = nil
    end
  else
    DeactivateTile(TILE)
  end
end

---
--- @brief  Toggle the state of charge display override
--- @param  gre#context mapargs
function cb_toggle_state_of_charge(mapargs)
  SendEvent("toggle_state_of_charge_display_override")
  local data = info.data or {}
  local message = sbsettings.get_state_of_charge_driver_message(data.info_code) or ""
  if message == "" then
    local args = { context_event = NOTIFICATION }
    CBNotify(args)
    info.notification_group = args.context_group
    if data.charge_level then
      local format = gre.get_value(info.notification_group..".content.format")
      message = string.format(format, (data.charge_level == "") and "??" or tostring(data.charge_level))
    end
    gre.set_value(info.notification_group..".content.value", message)
  end
end
