--[[
  @package    eg4-crank-ui-2
  @file       language.lua
  @brief      Handles changing and updating for the UI language
]]

local current_language = "EN"
local LANGUAGE_FILEPATH = gre.APP_ROOT .. "/translations/languages.csv"

local csv = require("utils/csv-reader")

--- Translate 2 digit code to language.
local language_codes = {
  ["DA"] = "Dansk",
  ["DE"] = "Deutsche",
  ["EN"] = "English",
  ["ES"] = "Español",
  ["FI"] = "Suomi",
  ["FR"] = "Français",
  ["ID"] = "Bahasa",
  ["IT"] = "Italiano",
  ["NL"] = "Nederlands",
  ["NO"] = "Norsk",
  ["PT"] = "Português",
  ["RO"] = "Română",
  ["SV"] = "Svenska",
  ["TR"] = "Türk",
  ["ZH"] = "繁體中文",
  ["CN"] = "简体中文"
}

---
--- @brief  Translate code to language
--- @param  string code
--- @return string language
local function convert_code_to_language(value)
  return language_codes[value] or value
end

---
--- @brief  Get current language
--- @return string language
function get_language()
  return convert_code_to_language(sbsettings.get_language())
end

---
--- @brief  Load the language from the csv file
local function load_language(language)
  if current_language == language and not sbsettings.test_mode then return end
  current_language = language

  local function find_column_match(fields, language)
    for column,text in pairs(fields) do
      if language == text then
        return column
      end
    end
  end

  local db = csv.open(LANGUAGE_FILEPATH)
  if db == nil then return end

  local default_column = nil
  local column = nil
  local data = {}
  for fields in db:lines() do
    if column == nil then
      default_column = find_column_match(fields, "EN")
      if not default_column then return end
      column = find_column_match(fields, language)
      if not column then return end
    else
      local key = fields[1]
      if fields[column] == nil or fields[column] == "" then
        data[key] = fields[default_column]
      else
        data[key] = fields[column]
      end
    end
  end
  db:close()
  gre.set_data(data)
end

---
--- @brief  Initialise the language from the currently non-volatile setting.
---
function cb_init_language()
  load_language(sbsettings.get_language())
end

---
--- @brief  Set current language
--- @param  value language string
function set_language(value)
  for k,v in pairs(language_codes) do
    if v == value then
      sbsettings.set_language(k)
      load_language(k)
      break
    end
  end
end


---
--- @brief  Save the language and update the user interface.
--- @param  gre#context mapargs
function cb_save_language_selection(mapargs)
  set_language(gre.get_value(mapargs.context_control .. ".text." .. mapargs.context_row .. ".1"))
end

---
--- @brief  Fetch the list of available translations
--- @return list of translations.
local function get_available_languages()
  local db = csv.open(LANGUAGE_FILEPATH)
  if not db then return end

  -- Read the list of languages. First line in the CSV file.
  for fields in db:lines() do
    table.remove(fields, 1)
    db:close()
    return fields
  end
end

---
--- @brief  Fetch the list of available translations
--- @return list
local function get_translation_list()
  local db = csv.open(LANGUAGE_FILEPATH)
  if db == nil then return end

  -- Read the list of languages. First line in the CSV file.
  local translation_list
  for fields in db:lines() do
    table.remove(fields,1)
    translation_list = fields
    db:close()
    break
  end
  return translation_list
end

---
--- @brief  Start the select language radio screen
--- @return list
function cb_start_language_select(mapargs)
  local translation_list = get_translation_list()
  local list = {}
  for _,value in pairs(translation_list) do
    if language_codes[value] then
      table.insert(list, language_codes[value])
    end
  end
  cb_start_radio_select(mapargs, list)
end
