--[[
  @package   eg4-crank-ui-2
  @file      screen-capture.lua
  @brief     Functionality for creating and exporting screenshots
]]

local LAYER = "screen_shot_layer"
local FOLDER = "screenshots"
local MEDIA_DEFAULT = "/media/*/"..FOLDER
local media_folder = MEDIA_DEFAULT
local timer
local control
local external_screen_capture

---
-- @brief  Determines the index for the next image filename.
local function get_next_value()
  local list = fileinfo:scandir(media_folder)
  value = 1
  for _,filename in pairs(list) do
    if filename:starts_with("image-") and filename:ends_with(".png") then
      local index = tonumber(filename:sub(7, #filename - 4))
      if value <= index then
        value = index + 1
      end
    end
  end
  return value
end

---
-- @brief  Renames the temporary file once the screen shot is complete.
function cb_screen_capture_complete()
  local filepath = tostring(gre.get_value("screen_capture_filepath"))
  gre.log(gre.LOG_INFO, "Saved screen shot "..filepath)
  if external_screen_capture then
    os.execute("touch /tmp/screen-capture-complete")
    external_screen_capture = nil
    return
  end
  gre.set_value(control..".grd_hidden", 0)
  cb_error_tone()
end

---
-- @brief  Callback to indicate the screen shot failed.
-- @param  mapargs The event data
function cb_screen_capture_failed(mapargs)
  gre.log(gre.LOG_ERROR, "Screen capture failed: "..tostring(gre.get_value("screen_capture_filepath")))
  gre.set_value(control..".grd_hidden", 0)
  cb_error_tone()
end

---
-- @brief  Callback to save the screen shot to the USB stick.
-- @param  mapargs The event data
function cb_external_capture_screen(mapargs)
  external_screen_capture = true
  local filepath = mapargs.context_event_data.text
  gre.log(gre.LOG_INFO, "Saving screen shot "..filepath)
  os.execute("rm /tmp/screen-capture-complete 2&>/dev/null")
  gre.set_value("screen_capture_filepath", filepath)
  gre.send_event("capture_screen")
end

---
-- @brief  Initiates the screen shot once the timer has expired.
local function cb_screen_capture()
  timer = nil
  local value = get_next_value() or 1
  gre.set_value(control..".text", value)
  gre.set_value("screen_capture_filepath", media_folder.."/image-"..value..".png")
  gre.send_event("capture_screen")
end

---
-- @brief  Starts the screen shot process
function cb_do_screen_capture(mapargs)
  os.execute('mount -o rw,remount $(dirname "'..media_folder..'") ; mkdir -p '..media_folder)
  control = tostring(mapargs.context_control)
  timer = gre.timer_set_timeout(cb_screen_capture, 100)
  gre.set_value(control..".grd_hidden", 1)
end

---
-- @brief  Callback to enable screen shot icon if the folder is present
function cb_enable_screen_capture(mapargs)
  -- Only perform this action on target
  if not gre.APP_ROOT:starts_with("/usr/share") then return end

  if mapargs.context_event_data ~= nil and mapargs.context_event_data.text ~= nil then
    media_folder = mapargs.context_event_data.text..'/'..FOLDER
    if not fileinfo:isfolder(media_folder) then return end
  else
    local list = fileinfo:find_folder(MEDIA_DEFAULT)
    if list == nil  or #list ~= 1 then return end
    media_folder = list[1]
  end
  gre.set_value(LAYER..".capture.text", get_next_value() - 1)
  gre.set_layer_attrs_global(LAYER, { hidden = 0 })
end

---
-- @brief  Callback to disable screen shot icon when USB stick removed.
function cb_disable_screen_capture(mapargs)
  gre.set_layer_attrs_global(LAYER, { hidden = 1 })
end

