local ls = require "luasnip"

-- local snippet = ls.s
local snippet_from_nodes = ls.sn
local c = ls.choice_node
local d = ls.dynamic_node
local i = ls.insert_node
local f = ls.function_node
local t = ls.text_node

local fmt = require("luasnip.extras.fmt").fmt

local require_var = function(args, _)
  local text = args[1][1] or ""
  local split = vim.split(text, ".", { plain = true })

  local options = {}
  for len = 0, #split - 1 do
    table.insert(options, t(table.concat(vim.list_slice(split, #split - len, #split), "_")))
  end

  return snippet_from_nodes(nil, {
    c(1, options),
  })
end

local newline = function(text)
  return t { "", text }
end

return {
  req = fmt([[local {} = require("{}")]], {
    d(2, require_var, { 1 }),
    i(1),
  }),
  lf = {
    desc = "table function",
    "local ",
    i(1),
    " = function(",
    i(2),
    ")",
    newline "  ",
    i(0),
    newline "end",
  },

  preq = fmt(
    [[local ok, {} = pcall(require, "{}")
if not ok then
    return
end]],
    {
      f(function(args)
        return args[1][1]
      end, { 1 }),
      i(1),
    }
  ),

  plugin = fmt(
    [[return {{
    "{}"
}}]],
    {
      i(1, "plugin"),
    }
  ),
}
