local list_utils = require("codesnap.utils.list")
local table_utils = {}

function table_utils.assign(t, props)
  for k, v in pairs(props) do
    t[k] = v
  end
end

function table_utils.merge(t1, t2)
  for k, v in pairs(t2) do
    t1[k] = v
  end

  return t1
end

function table_utils.is_array(t)
  return type(t[1]) == "number"
end

function table_utils.typeof(value)
  if type(value) == "table" then
    if table_utils.is_array(value) then
      return "array"
    else
      return "table"
    end
  end

  return type(value)
end

function table_utils.serialize_array(t)
  local result = list_utils.map(t, function(ele)
    table_utils.to_string(ele)
  end)

  return "[" .. result.concat(t, ",") .. "]"
end

function table_utils.serialize_table(t)
  local result = {}

  for key, value in pairs(t) do
    table.insert(result, string.format("%s = %s", key, table_utils.to_string(value)))
  end

  return "{" .. table.concat(result, ",") .. "}"
end

function table_utils.serialize_string(value)
  return "[[" .. value .. "]]"
end

function table_utils.to_string(t)
  local complex_type_parser = {
    array = table_utils.serialize_array,
    table = table_utils.serialize_table,
    string = table_utils.serialize_string,
  }

  local parse = complex_type_parser[table_utils.typeof(t)] or function(v)
    return v
  end

  return parse(t)
end

-- function table_utils.to_string(t)
--   local result = ""
--
--   for key, value in pairs(t) do
--     result = result .. key .. ":" .. tostring(value) .. ","
--   end
--
--   return "{" .. result .. "}"
-- end

return table_utils