local ls = require("luasnip")
local s = ls.snippet
local sn = ls.snippet_node
local isn = ls.indent_snippet_node
local t = ls.text_node
local i = ls.insert_node
local f = ls.function_node
local c = ls.choice_node
local d = ls.dynamic_node
local r = ls.restore_node
local events = require("luasnip.util.events")
local ai = require("luasnip.nodes.absolute_indexer")
local extras = require("luasnip.extras")
local l = extras.lambda
local rep = extras.rep
local p = extras.partial
local m = extras.match
local n = extras.nonempty
local dl = extras.dynamic_lambda
local fmt = require("luasnip.extras.fmt").fmt
local fmta = require("luasnip.extras.fmt").fmta
local conds = require("luasnip.extras.expand_conditions")
local postfix = require("luasnip.extras.postfix").postfix
local types = require("luasnip.util.types")
local parse = require("luasnip.util.parser").parse_snippet
local ms = ls.multi_snippet
local k = require("luasnip.nodes.key_indexer").new_key

local pe = s(
  "pe",
  fmt("<%= {final} %>", {
    final = i(1),
  }, { priority = 1001 })
)

local ln = s(
  "ln",
  fmt(
    [[
<.link navigate={{~p"{path}"}}">{final}</.link>
]],
    { path = i(1, "/"), final = i(2) },
    { priority = 1001 }
  )
)

local lp = s(
  "lp",
  fmt(
    [[
<.link patch={{~p"{path}"}}">{final}</.link>
]],
    { path = i(1, "/"), final = i(2) },
    { priority = 1001 }
  )
)

local if_ = s(
  "if",
  fmt("<%= if {condition} do %>{final}<% end %>", { condition = i(1, "condition"), final = i(2) }, { priority = 1001 })
)

local ife = s(
  "ife",
  fmt(
    [[
<%= if {condition} do %>
  {when}
<% else %>
  {final}
<% end %>"
    ]],
    { condition = i(1, "condition"), when = i(2), final = i(3) },
    { priority = 1001 }
  )
)

local for_ = s(
  "for",
  fmt(
    [[
<%= for {item} <- {list} do %>
  {final}
<% end %>
    ]],
    { item = i(1, "item"), list = i(2, "items"), final = i(3) },
    { priority = 1001 }
  )
)

local lc =
  s("lc", fmt("<.live_component module={{{module}}} id={{{id}}} />", { module = i(1), id = i(2) }, { priority = 1001 }))

local slot = s(
  "slot",
  fmt("<:slot>{final}</:slot>", {
    final = i(1),
  }, { priority = 1001 })
)

local socketp = s(
  "socketp",
  fmt(
    [[
socket =
  socket
  |> {final}
]],
    { final = i(1) },
    { priority = 1001 }
  )
)

local fl = s(
  "fl",
  fmt(
    [[
<{elem} :for={{{item} <- {list}}} class="{class}">
  {final}
</{elem}>
]],
    { elem = i(1, "div"), item = i(2, "item"), list = i(3, "items"), class = i(4), final = i(5) },
    { priority = 1001, repeat_duplicates = true }
  )
)

return {
  pe,
  ln,
  lp,
  if_,
  ife,
  for_,
  lc,
  slot,
  socketp,
  fl,
}