local M = {}

function M.new_style()
  ---@diagnostic disable-next-line: undefined-field
  return vim.treesitter.highlighter.hl_map == nil
end

function M.get(group)
  if group:sub(1, 1) ~= "@" or M.new_style() then
    return group
  end

  group = group:sub(2)

  local lang
  while group do
    if M.fallbacks[group] then
      return (lang or "") .. M.fallbacks[group]
    end
    group, lang = group:match("(.*)%.(.*)")
  end
end

-- taken from https://github.com/nvim-treesitter/nvim-treesitter/blob/master/lua/nvim-treesitter/highlight.lua
M.fallbacks = {
  ["annotation"] = "TSAnnotation",
  ["attribute"] = "TSAttribute",
  ["boolean"] = "TSBoolean",
  ["character"] = "TSCharacter",
  ["character.special"] = "TSCharacterSpecial",
  ["comment"] = "TSComment",
  ["conditional"] = "TSConditional",
  ["constant"] = "TSConstant",
  ["constant.builtin"] = "TSConstBuiltin",
  ["constant.macro"] = "TSConstMacro",
  ["constructor"] = "TSConstructor",
  ["debug"] = "TSDebug",
  ["define"] = "TSDefine",
  ["error"] = "TSError",
  ["exception"] = "TSException",
  ["field"] = "TSField",
  ["float"] = "TSFloat",
  ["function"] = "TSFunction",
  ["function.call"] = "TSFunctionCall",
  ["function.builtin"] = "TSFuncBuiltin",
  ["function.macro"] = "TSFuncMacro",
  ["include"] = "TSInclude",
  ["keyword"] = "TSKeyword",
  ["keyword.function"] = "TSKeywordFunction",
  ["keyword.operator"] = "TSKeywordOperator",
  ["keyword.return"] = "TSKeywordReturn",
  ["label"] = "TSLabel",
  ["method"] = "TSMethod",
  ["method.call"] = "TSMethodCall",
  ["namespace"] = "TSNamespace",
  ["none"] = "TSNone",
  ["number"] = "TSNumber",
  ["operator"] = "TSOperator",
  ["parameter"] = "TSParameter",
  ["parameter.reference"] = "TSParameterReference",
  ["preproc"] = "TSPreProc",
  ["property"] = "TSProperty",
  ["punctuation.delimiter"] = "TSPunctDelimiter",
  ["punctuation.bracket"] = "TSPunctBracket",
  ["punctuation.special"] = "TSPunctSpecial",
  ["repeat"] = "TSRepeat",
  ["storageclass"] = "TSStorageClass",
  ["string"] = "TSString",
  ["string.regex"] = "TSStringRegex",
  ["string.escape"] = "TSStringEscape",
  ["string.special"] = "TSStringSpecial",
  ["symbol"] = "TSSymbol",
  ["tag"] = "TSTag",
  ["tag.attribute"] = "TSTagAttribute",
  ["tag.delimiter"] = "TSTagDelimiter",
  ["text"] = "TSText",
  ["text.strong"] = "TSStrong",
  ["text.emphasis"] = "TSEmphasis",
  ["text.underline"] = "TSUnderline",
  ["text.strike"] = "TSStrike",
  ["text.title"] = "TSTitle",
  ["text.literal"] = "TSLiteral",
  ["text.uri"] = "TSURI",
  ["text.math"] = "TSMath",
  ["text.reference"] = "TSTextReference",
  ["text.environment"] = "TSEnvironment",
  ["text.environment.name"] = "TSEnvironmentName",
  ["text.note"] = "TSNote",
  ["text.warning"] = "TSWarning",
  ["text.danger"] = "TSDanger",
  ["todo"] = "TSTodo",
  ["type"] = "TSType",
  ["type.builtin"] = "TSTypeBuiltin",
  ["type.qualifier"] = "TSTypeQualifier",
  ["type.definition"] = "TSTypeDefinition",
  ["variable"] = "TSVariable",
  ["variable.builtin"] = "TSVariableBuiltin",
}

M.defaults = {
  ["@annotation"] = {
    default = true,
    link = "PreProc",
  },
  ["@attribute"] = {
    default = true,
    link = "PreProc",
  },
  ["@boolean"] = {
    default = true,
    link = "Boolean",
  },
  ["@character"] = {
    default = true,
    link = "Character",
  },
  ["@character.special"] = {
    default = true,
    link = "SpecialChar",
  },
  ["@comment"] = {
    default = true,
    link = "Comment",
  },
  ["@conditional"] = {
    default = true,
    link = "Conditional",
  },
  ["@constant"] = {
    default = true,
    link = "Constant",
  },
  ["@constant.builtin"] = {
    default = true,
    link = "Special",
  },
  ["@constant.macro"] = {
    default = true,
    link = "Define",
  },
  ["@constructor"] = {
    default = true,
    link = "Special",
  },
  ["@debug"] = {
    default = true,
    link = "Debug",
  },
  ["@define"] = {
    default = true,
    link = "Define",
  },
  ["@exception"] = {
    default = true,
    link = "Exception",
  },
  ["@field"] = {
    default = true,
    link = "Identifier",
  },
  ["@float"] = {
    default = true,
    link = "Float",
  },
  ["@function"] = {
    default = true,
    link = "Function",
  },
  ["@function.builtin"] = {
    default = true,
    link = "Special",
  },
  ["@function.call"] = {
    default = true,
    link = "@function",
  },
  ["@function.macro"] = {
    default = true,
    link = "Macro",
  },
  ["@include"] = {
    default = true,
    link = "Include",
  },
  ["@keyword"] = {
    default = true,
    link = "Keyword",
  },
  ["@keyword.conditional"] = {
    default = true,
    link = "Conditional",
  },
  ["@keyword.function"] = {
    default = true,
    link = "Keyword",
  },
  ["@keyword.operator"] = {
    default = true,
    link = "@operator",
  },
  ["@keyword.return"] = {
    default = true,
    link = "@keyword",
  },
  ["@label"] = {
    default = true,
    link = "Label",
  },
  ["@method"] = {
    default = true,
    link = "Function",
  },
  ["@method.call"] = {
    default = true,
    link = "@method",
  },
  ["@namespace"] = {
    default = true,
    link = "Include",
  },
  ["@none"] = {
    default = true,
  },
  ["@number"] = {
    default = true,
    link = "Number",
  },
  ["@operator"] = {
    default = true,
    link = "Operator",
  },
  ["@parameter"] = {
    default = true,
    link = "Identifier",
  },
  ["@parameter.reference"] = {
    default = true,
    link = "@parameter",
  },
  ["@preproc"] = {
    default = true,
    link = "PreProc",
  },
  ["@property"] = {
    default = true,
    link = "Identifier",
  },
  ["@punctuation.bracket"] = {
    default = true,
    link = "Delimiter",
  },
  ["@punctuation.delimiter"] = {
    default = true,
    link = "Delimiter",
  },
  ["@punctuation.special"] = {
    default = true,
    link = "Delimiter",
  },
  ["@repeat"] = {
    default = true,
    link = "Repeat",
  },
  ["@storageclass"] = {
    default = true,
    link = "StorageClass",
  },
  ["@string"] = {
    default = true,
    link = "String",
  },
  ["@string.escape"] = {
    default = true,
    link = "SpecialChar",
  },
  ["@string.regex"] = {
    default = true,
    link = "String",
  },
  ["@string.special"] = {
    default = true,
    link = "SpecialChar",
  },
  ["@symbol"] = {
    default = true,
    link = "Identifier",
  },
  ["@tag"] = {
    default = true,
    link = "Label",
  },
  ["@tag.attribute"] = {
    default = true,
    link = "@property",
  },
  ["@tag.delimiter"] = {
    default = true,
    link = "Delimiter",
  },
  ["@text"] = {
    default = true,
    link = "@none",
  },
  ["@text.danger"] = {
    default = true,
    link = "WarningMsg",
  },
  ["@text.emphasis"] = {
    default = true,
    italic = true,
  },
  ["@text.environment"] = {
    default = true,
    link = "Macro",
  },
  ["@text.environment.name"] = {
    default = true,
    link = "Type",
  },
  ["@text.literal"] = {
    default = true,
    link = "String",
  },
  ["@text.math"] = {
    default = true,
    link = "Special",
  },
  ["@text.note"] = {
    default = true,
    link = "SpecialComment",
  },
  ["@text.reference"] = {
    default = true,
    link = "Constant",
  },
  ["@text.strike"] = {
    strikethrough = true,
  },
  ["@text.strong"] = {
    bold = true,
    default = true,
  },
  ["@text.title"] = {
    default = true,
    link = "Title",
  },
  ["@text.underline"] = {
    underline = true,
  },
  ["@text.uri"] = {
    default = true,
    link = "Underlined",
  },
  ["@text.warning"] = {
    default = true,
    link = "Todo",
  },
  ["@todo"] = {
    default = true,
    link = "Todo",
  },
  ["@type"] = {
    default = true,
    link = "Type",
  },
  ["@type.builtin"] = {
    default = true,
    link = "Type",
  },
  ["@type.definition"] = {
    default = true,
    link = "Typedef",
  },
  ["@type.qualifier"] = {
    default = true,
    link = "Type",
  },
  ["@variable.builtin"] = {
    default = true,
    link = "Special",
  },
}

return M
