---
--- @package   eg4-crank-ui
--- @file      screen-shot.lua
--- @brief     Functionality for creating screenshots and exporting them to a memory stick
---
--- @copyright Copyright 2019 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.
---
---

local FOLDER = "screenshots"
local MEDIA_DEFAULT = "/media/*/"..FOLDER
local media_folder = MEDIA_DEFAULT
local timer = nil
local control = nil
local external_screenshot

---
--- @brief  Fetches list of files and folders in a dir.
---
local function findFolder()
  local t = fileinfo:execute('ls -d -1 '..MEDIA_DEFAULT..' 2>/dev/null | head -1')
  return t[1]
end

---
--- @brief  Determines the index for the next image filename.
---
function getNextValue()
  local list = fileinfo:scandir(media_folder)
  value = 1
  for _,filename in pairs(list) do
    if string.starts_with(filename, "image-") and string.ends_with(filename, ".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 CBScreenShotComplete()
  local filepath = tostring(gre.get_value("screenshot_filepath"))
  print("Saved screen shot "..filepath)
  if external_screenshot then
    os.execute("touch /tmp/screen-capture-complete")
    external_screenshot = nil
    return
  end
  gre.set_control_attrs(control, { hidden = 0 })
  playError()
end

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

---
--- @brief  Initiates the screen shot once the timer has expired.
---
local function CBScreenShot()  
  timer = nil

  local value = getNextValue() or 1
  gre.set_value(control..".text", value)

  gre.set_value("screenshot_filepath", media_folder.."/image-"..value..".png")

  gre.send_event("screenshot")
end

---
--- @brief  Starts the screen shot process
---
function CBDoScreenShot(mapargs) 
  os.execute('mount -o rw,remount $(dirname "'..media_folder..'") ; mkdir -p '..media_folder)

  control = tostring(mapargs.context_control)
  timer = gre.timer_set_timeout(CBScreenShot, 100)

  gre.set_control_attrs(control, { hidden = 1 })
end


---
--- @brief  Checks if the path is a folder
--- 
local function isdir(path)
    local f = io.open(path, "r")
    if f == nil then return false end
    local ok, err, code = f:read(1)
    f:close()
    return code == 21
end

---
--- @brief  Callback to enable screen shot icon if the folder is present
--- 
function CBEnableScreenShot(mapargs)
  if mapargs.context_event_data ~= nil and mapargs.context_event_data.text ~= nil then
    media_folder = mapargs.context_event_data.text..'/'..FOLDER
  else
    local path = findFolder()
    if path ~= nil then
      media_folder = path
    end
  end
  if isdir(media_folder) then
    gre.set_value("screen_shot_layer.do_screen_shot.text", getNextValue() - 1)
    gre.set_layer_attrs_global("screen_shot_layer", { hidden = 0 })
  else
    gre.set_layer_attrs_global("screen_shot_layer", { hidden = 1 })
  end
end

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

