local M = {}

---@param c Ef-Theme
---@param opts Ef-Themes.Config
function M.get(c, opts)
  -- stylua: ignore
  return {
    -- ["@lsp.type.interface"]                   = { fg        = Util.blend_fg(c.blue1, 0.7) },
    -- ["@lsp.typemod.typeAlias.defaultLibrary"] = { fg        = Util.blend_bg(c.blue1, 0.8) },
    ["@lsp.type.boolean"]                        = { link      = "@boolean" },
    ["@lsp.type.builtinType"]                    = { link      = "@type.builtin" },
    ["@lsp.type.class"] = { fg = c.type, style = opts.styles.classes },
    ["@lsp.type.comment"]                        = { link      = "@comment" },
    ["@lsp.type.decorator"]                      = { link      = "@attribute" },
    ["@lsp.type.deriveHelper"]                   = { link      = "@attribute" },
    ["@lsp.type.enum"]                           = { link      = "@type" },
    ["@lsp.type.enumMember"]                     = { link      = "@constant" },
    ["@lsp.type.escapeSequence"]                 = { link      = "@string.escape" },
    ["@lsp.type.formatSpecifier"]                = { link      = "@markup.list" },
    ["@lsp.type.generic"]                        = { link      = "@variable" },
    ["@lsp.type.keyword"]                        = { link      = "@keyword" },
    ["@lsp.type.lifetime"]                       = { link      = "@keyword.storage" },
    ["@lsp.type.namespace"]                      = { link      = "@module" },
    ["@lsp.type.namespace.python"]               = { link      = "@variable" },
    ["@lsp.type.number"]                         = { link      = "@number" },
    ["@lsp.type.operator"]                       = { link      = "@operator" },
    ["@lsp.type.parameter"]                      = { link      = "@variable.parameter" },
    ["@lsp.type.property"]                       = { link      = "@property" },
    ["@lsp.type.selfKeyword"]                    = { link      = "@variable.builtin" },
    ["@lsp.type.selfTypeKeyword"]                = { link      = "@variable.builtin" },
    ["@lsp.type.string"]                         = { link      = "@string" },
    ["@lsp.type.typeAlias"]                      = { link      = "@type.definition" },
    ["@lsp.type.unresolvedReference"]            = { undercurl = true, sp = c.err },
    ["@lsp.type.variable"]                       = {}, -- use treesitter styles for regular variables
    ["@lsp.typemod.class.defaultLibrary"]        = { link      = "@type.builtin" },
    ["@lsp.typemod.enum.defaultLibrary"]         = { link      = "@type.builtin" },
    ["@lsp.typemod.enumMember.defaultLibrary"]   = { link      = "@constant.builtin" },
    ["@lsp.typemod.function.defaultLibrary"]     = { link      = "@function.builtin" },
    ["@lsp.typemod.keyword.async"]               = { link      = "@keyword.coroutine" },
    ["@lsp.typemod.keyword.injected"]            = { link      = "@keyword" },
    ["@lsp.typemod.macro.defaultLibrary"]        = { link      = "@function.builtin" },
    ["@lsp.typemod.method.defaultLibrary"]       = { link      = "@function.builtin" },
    ["@lsp.typemod.operator.injected"]           = { link      = "@operator" },
    ["@lsp.typemod.string.injected"]             = { link      = "@string" },
    ["@lsp.typemod.struct.defaultLibrary"]       = { link      = "@type.builtin" },
    ["@lsp.typemod.type.defaultLibrary"]         = { fg        = c.accent_0 },
    ["@lsp.typemod.variable.callable"]           = { link      = "@function" },
    ["@lsp.typemod.variable.defaultLibrary"]     = { link      = "@variable.builtin" },
    ["@lsp.typemod.variable.injected"]           = { link      = "@variable" },
    ["@lsp.typemod.variable.static"]             = { link      = "@constant" },
  }
end

return M
