local Util = require("jellybeans.util")

local M = {}

function M.get(c, opts)
  return {
    ["@lsp.type.boolean"] = "@boolean",
    ["@lsp.type.builtinType"] = "@type.builtin",
    ["@lsp.type.comment"] = "@comment",
    ["@lsp.type.decorator"] = {},
    ["@lsp.type.decorator.rust"] = {},
    ["@lsp.type.deriveHelper"] = "@attribute",
    ["@lsp.type.enum"] = "@type",
    ["@lsp.type.enumMember"] = "@constant",
    ["@lsp.type.escapeSequence"] = "@string.escape",
    ["@lsp.type.formatSpecifier"] = "SpecialChar",
    ["@lsp.type.generic"] = "@variable",
    ["@lsp.type.keyword"] = "@keyword",
    ["@lsp.type.keyword.go"] = {},
    ["@lsp.type.lifetime"] = "@keyword.storage",
    ["@lsp.type.namespace"] = "@module",
    ["@lsp.type.namespace.go"] = { fg = c.alto, italic = opts.italics },
    ["@lsp.type.namespace.python"] = "@module",
    ["@lsp.type.number"] = "@number",
    ["@lsp.type.operator"] = "@operator",
    ["@lsp.type.parameter"] = "@variable.parameter",
    ["@lsp.type.property"] = "@property",
    ["@lsp.type.property.terraform"] = { italic = opts.italics },
    ["@lsp.type.selfKeyword"] = "@variable.builtin",
    ["@lsp.type.selfTypeKeyword"] = "@variable.builtin",
    ["@lsp.type.string"] = {}, -- use treesitter styles for strings
    ["@lsp.type.typeAlias"] = "@type.definition",
    ["@lsp.type.variable"] = {}, -- use treesitter styles for regular variables
    ["@lsp.typemod.class.defaultLibrary"] = "@type.builtin",
    ["@lsp.typemod.class.defaultLibrary.python"] = { italic = opts.italics },
    ["@lsp.typemod.enum.defaultLibrary"] = "@type.builtin",
    ["@lsp.typemod.enumMember.defaultLibrary"] = "@constant.builtin",
    ["@lsp.typemod.function.defaultLibrary"] = "@function.builtin",
    ["@lsp.typemod.keyword.async"] = "@keyword.coroutine",
    ["@lsp.typemod.keyword.injected"] = "@keyword",
    ["@lsp.typemod.macro.defaultLibrary"] = "@function.builtin",
    ["@lsp.typemod.method.defaultLibrary"] = "@function.builtin",
    ["@lsp.typemod.method.defaultLibrary.rust"] = "Function",
    ["@lsp.typemod.operator.injected"] = "@operator",
    ["@lsp.typemod.string.injected"] = "@string",
    ["@lsp.typemod.struct.defaultLibrary"] = "@type.builtin",
    ["@lsp.typemod.struct.defaultLibrary.rust"] = "Type",
    ["@lsp.type.builtinType.rust"] = "Type",
    ["@lsp.typemod.variable.callable"] = "@function",
    ["@lsp.typemod.variable.defaultLibrary"] = "@variable.builtin",
    ["@lsp.typemod.variable.injected"] = "@variable",
    ["@lsp.typemod.variable.static"] = "@constant",

    LspKindArray = "@punctuation.bracket",
    LspKindBoolean = "@boolean",
    LspKindClass = "@type",
    LspKindColor = "Special",
    LspKindConstant = "@constant",
    LspKindConstructor = "@constructor",
    LspKindEnum = "@lsp.type.enum",
    LspKindEnumMember = "@lsp.type.enumMember",
    LspKindEvent = "Special",
    LspKindField = "@variable.member",
    LspKindFile = "Normal",
    LspKindFolder = "Directory",
    LspKindFunction = "@function",
    LspKindInterface = "@lsp.type.interface",
    LspKindKey = "@variable.member",
    LspKindKeyword = "@lsp.type.keyword",
    LspKindMethod = "@function.method",
    LspKindModule = "@module",
    LspKindNamespace = "@module",
    LspKindNull = "@constant.builtin",
    LspKindNumber = "@number",
    LspKindObject = "@constant",
    LspKindOperator = "@operator",
    LspKindPackage = "@module",
    LspKindProperty = "@property",
    LspKindReference = "@markup.link",
    LspKindSnippet = "Conceal",
    LspKindString = "@string",
    LspKindStruct = "@lsp.type.struct",
    LspKindText = "@markup",
    LspKindTypeParameter = "@lsp.type.typeParameter",
    LspKindUnit = "@lsp.type.struct",
    LspKindValue = "@string",
    LspKindVariable = "@variable",
  }
end

return M
