---@class lib
local M = {}

M.lsp = require('lib.lsp')
M.prettier = require('lib.prettier')

---Find the root of a project based on `vim.g.root_spec`. Defaults to
---`{ '.git' }` if unset.
---@return string?
function M.root()
  local root_spec = vim.g.root_spec or { '.git' }

  return vim.fs.root(0, root_spec)
end

---Require a file relative to the given prefix, to avoid repetition.
---@param prefix string The string to prefix to all req calls.
function M.local_require(prefix)
  ---@param mod string The module to require.
  return function(mod)
    return require(prefix .. '.' .. mod)
  end
end

---Get and format the foreground of a highlight group.
---@param name string The highlight group name to fetch from.
---@return {fg:string}?
function M.fg(name)
  local hl = vim.api.nvim_get_hl(0, { name = name, link = false })

  return hl and { fg = string.format('#%06x', hl.fg) } or nil
end

---Generates a function that can be used to create which-key mappings.
---@param color string The color to use for the icon.
---@return function
function M.wkSpec(color)
  ---@param lhs string
  ---@param rhs string | fun()
  ---@param icon string | wk.Icon
  ---@param opts? wk.Spec
  return function(lhs, rhs, icon, opts)
    if type(icon) == 'string' then
      icon = { icon = icon, color = color }
    else
      icon = vim.tbl_deep_extend('force', icon, { color = color })
    end

    return vim.tbl_deep_extend('force', { lhs, rhs, icon = icon }, (opts or {}))
  end
end

return M