--[[
  @package    eg4-crank-ui-2
  @file       hanover-cloud.lua
  @brief      Handles the Hanover cloud settings screen and functionality
]]

---
--- @brief  get the hanover cloud time of day start/end
function get_wdmc_time_of_day_start_end()
  local value1 = sbsettings.get_wdmc_time_of_day_start();
  local value2 = sbsettings.get_wdmc_time_of_day_end();
  return string.format("%02d:%02d - %02d:%02d", value1 / 60, value1 % 60, value2 / 60, value2 % 60);
end

---
--- @brief  Set the hanover cloud vehicle id
function cb_set_wdmc_vehicle_id(value)
  sbsettings.set_wdmc_vehicle_id(value)
  cb_back_screen()
  return true
end

---
--- @brief  Set the hanover cloud server address
function cb_set_wdmc_server_address(value)
  sbsettings.set_wdmc_server_address(value)
  cb_back_screen()
  return true
end

---
--- @brief  Set the hanover cloud username
function cb_set_wdmc_username(value)
  sbsettings.set_wdmc_username(value)
  cb_back_screen()
  return true
end

---
--- @brief  Set the hanover cloud password
function cb_set_wdmc_password(value)
  sbsettings.set_wdmc_password(value)
  cb_back_screen()
  return true
end

---
--- @brief  Set the hanover cloud download interval
function cb_set_wdmc_download_interval(value)
  if tonumber(value) == nil then return end
  sbsettings.set_wdmc_download_interval(tonumber(value))
  cb_back_screen()
  return true
end

---
--- @brief  Update the time of day range preview
local time_of_day_range
local function update_time_of_day_range_preview()
  local text = string.format("%02d:%02d - %02d:%02d", time_of_day_range.start_time.hour, time_of_day_range.start_time.min, time_of_day_range.end_time.hour, time_of_day_range.end_time.min)
  gre.set_value("time_of_day_range_controls_layer.current_value.text", text)
end

---
--- @brief  Initialise the download scheduler screen
function cb_init_download_scheduler_time_of_day_range()
  local start_time = sbsettings.get_wdmc_time_of_day_start();
  local end_time = sbsettings.get_wdmc_time_of_day_end();
  time_of_day_range = {
    start_time = {
      hour = math.floor(start_time / 60),
      min = start_time % 60
    },
    end_time = {
      hour = math.floor(end_time / 60),
      min = end_time % 60
    }
  }
  init_set_time("time_of_day_range_start_layer", time_of_day_range.start_time)
  init_set_time("time_of_day_range_end_layer", time_of_day_range.end_time)
  update_time_of_day_range_preview()
end

---
--- @brief  Callback to handle the start hour edit
--- @param  gre#context mapargs
function cb_time_of_day_start_hour_edit(mapargs)
  time_of_day_range.start_time.hour = cb_time_hour_edit(mapargs)
  update_time_of_day_range_preview()
end

---
--- @brief  Callback to handle the start minute edit
--- @param  gre#context mapargs
function cb_time_of_day_start_minute_edit(mapargs)
  time_of_day_range.start_time.min = cb_time_minute_edit(mapargs)
  update_time_of_day_range_preview()
end

---
--- @brief  Callback to handle the end hour edit
--- @param  gre#context mapargs
function cb_time_of_day_end_hour_edit(mapargs)
  time_of_day_range.end_time.hour = cb_time_hour_edit(mapargs)
  update_time_of_day_range_preview()
end

---
--- @brief  Callback to handle the end minute edit
--- @param  gre#context mapargs
function cb_time_of_day_end_minute_edit(mapargs)
  time_of_day_range.end_time.min = cb_time_minute_edit(mapargs)
  update_time_of_day_range_preview()
end

---
--- @brief  Callback to handle the updating of the time of day range
--- @param  gre#context mapargs
function cb_set_download_scheduler_time_of_day_range(mapargs)
  sbsettings.set_wdmc_time_of_day_start(time_of_day_range.start_time.hour * 60 + time_of_day_range.start_time.min)
  sbsettings.set_wdmc_time_of_day_end(time_of_day_range.end_time.hour * 60 + time_of_day_range.end_time.min)
  if mapargs.event then send_event(mapargs.event) end
  cb_back_screen()
end

---
--- @brief  Initialise the controlled destination ids screen
function cb_init_controlled_destination_ids(mapargs)
  local value = sbsettings.get_wdmc_controlled_destination_ids()
  local items = value == "" and {} or value:split(",")
  local context_control = get_list_control(mapargs.context_screen)
  local data = {}
  for index=1,#items do
    data[context_control..".text."..index..".1"] = items[index]
    data[context_control..".alpha_pressed."..index..".1"] = 0
  end
  gre.set_data(data)
  local height = gre.get_table_cell_attrs(context_control, 1, 1, "height").height
  gre.set_table_attrs(context_control, { height = #items * height, rows = #items })
  cb_update_menu(mapargs)
end

---
--- @brief  Delete a controlled destination id
--- @param  gre#context mapargs
function cb_del_controlled_destination_id(mapargs)
  local context_control = mapargs.context_control
  local row = mapargs.context_row
  local value = gre.get_value(context_control..".text."..row..".1")
  sbsettings.del_wdmc_controlled_destination_id(value)
  send_event("settings_updated")
  cb_init_controlled_destination_ids(mapargs)
end

---
--- @brief  Start a new controlled destination id entry
--- @param  gre#context mapargs
local selected_route_code
function cb_start_new_controlled_destination_id(mapargs)
  if get_route_code_len() == 0 then
    screen_transition("select_controlled_destination_code")
    selected_route_code = "-1"
  else
    screen_transition("select_controlled_route_code")
    selected_route_code = ""
  end
end

---
--- @brief  Submit the selected route code for the controlled destination id
--- @param  value new route code
--- @return true if valid value
function cb_controlled_destination_route_code_submit(value)
  if value == "" then return end
  selected_route_code = value
  screen_transition("select_controlled_destination_code")
  return true
end

---
--- @brief  Any route code required for controlled destination id
function cb_controlled_destination_any_route()
  cb_controlled_destination_route_code_submit("-1")
end

---
--- @brief  Submit the selected destination code for the controlled destination id
--- @param  value new destination code
--- @return true if valid value
function cb_controlled_destination_code_submit(value)
  if value == "" then return end
  value = selected_route_code.." "..value
  sbsettings.add_wdmc_controlled_destination_id(value)
  send_event("settings_updated")
  cb_back_screen()
end

---
--- @brief  Any destination code required for controlled destination id
function cb_controlled_destination_any_destination()
  cb_controlled_destination_code_submit("-1")
end

---
--- @brief  Get the hanover cloud vehicle id
--- @return The vehicle id
function ds_wdmc_vehicle_id()
  return { value = sbsettings.get_wdmc_vehicle_id() }
end

---
--- @brief  Get the hanover cloud server address
--- @return The server address
function ds_wdmc_server_address()
  return { value = sbsettings.get_wdmc_server_address() }
end

---
--- @brief  Get the hanover cloud username
--- @return The username
function ds_wdmc_username()
  return { value = sbsettings.get_wdmc_username() }
end
