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
