local hsl = require("dieter.hsl").hslToHex

local colors = {
	light = {
		background = hsl(240, 100, 100),
		foreground = hsl(0, 0, 13),

		string = hsl(96, 50, 33),
		comment = hsl(230, 66, 40),
		comment_error = hsl(2, 85, 40),

		diagnostic_error = hsl(347, 80, 45),
		diagnostic_warning = hsl(30, 100, 50),
		diagnostic_info = hsl(145, 80, 30),
		diagnostic_hint = hsl(145, 80, 30),

		popup_error_bg = hsl(0, 90, 99),
		popup_warning_bg = hsl(27, 90, 99),
		popup_info_bg = hsl(112, 90, 99),
		popup_hint_bg = hsl(112, 90, 99),

		add = hsl(84, 50, 80),
		add_quarter = hsl(84, 80, 95),
		change = hsl(41, 80, 80),
		change_quarter = hsl(224, 100, 85),
		delete = hsl(350, 100, 40),
		delete_quarter = hsl(350, 100, 85),

		dialog_bg = hsl(224, 5, 92),
		selection = hsl(270, 75, 92),
		highlight_subtle = hsl(0, 0, 94),
		dimmed = hsl(0, 0, 80),
	},

	dark = {
		background = hsl(216, 28, 7),
		foreground = hsl(0, 0, 80),
		dimmed = hsl(0, 0, 35),
		highlight_subtle = hsl(0, 0, 6),

		string = hsl(66, 50, 73),
		comment = hsl(230, 50, 75),
		comment_error = hsl(2, 85, 75),

		diagnostic_error = hsl(347, 100, 50),
		diagnostic_warning = hsl(30, 100, 50),
		diagnostic_info = hsl(176, 80, 60),
		diagnostic_hint = hsl(176, 80, 60),

		popup_error_bg = hsl(0, 95, 7),
		popup_warning_bg = hsl(27, 95, 7),
		popup_info_bg = hsl(112, 95, 7),
		popup_hint_bg = hsl(112, 95, 7),

		add = hsl(84, 50, 80),
		add_quarter = hsl(84, 80, 95),
		change = hsl(41, 80, 80),
		change_quarter = hsl(224, 100, 85),
		delete = hsl(350, 100, 40),
		delete_quarter = hsl(350, 100, 85),

		dialog_bg = hsl(224, 5, 92),

		selection = hsl(270, 50, 33),
	},
}

local c = colors[vim.o.background]

local theme = {
	Normal = { fg = c.foreground, bg = c.background },

	Constant = { link = "NormalNC" },
	Delimiter = { link = "NormalNC" },
	Identifier = { link = "NormalNC" },
	Keyword = { fg = c.foreground, bold = true },
	Operator = { link = "NormalNC" },
	Special = { link = "NormalNC" },
	Type = { link = "NormalNC" },

	String = { fg = c.string },

	Comment = { fg = c.comment, italic = true, bold = true },
	CommentError = { fg = c.comment_error, italic = true, bold = true },
	["@comment.note"] = { link = "Comment" },
	["@comment.todo"] = { link = "CommentError" },
	["@comment.error"] = { link = "CommentError" },
	["@comment.warning"] = { link = "CommentError" },

	DiffAdd = { fg = c.add, bg = c.add_quarter },
	GitSignsAdd = { fg = c.add, bg = c.background },
	GitSignsAddNr = { link = "DiffAdd" },
	DiffChange = { fg = c.change, bg = c.change_quarter },
	GitSignsChange = { fg = c.change, bg = c.background },
	GitSignsChangeNr = { link = "DiffChange" },
	DiffDelete = { fg = c.delete, bg = c.delete_quarter },
	GitSignsDelete = { fg = c.delete, bg = c.background },
	GitSignsDeleteNr = { link = "DiffDelete" },

	-- Treesitter
	["@function"] = { link = "NormalNC" },
	["@special"] = { link = "NormalNC" },
	["@variable"] = { link = "NormalNC" },

	-- UI Elements
	CursorLine = { bg = c.highlight_subtle },

	DiagnosticError = { fg = c.diagnostic_error, italic = true },
	DiagnosticUnderlineError = { fg = c.diagnostic_error, undercurl = true },
	DiagnosticFloatingError = { fg = c.diagnostic_error, bg = c.popup_error_bg },
	DiagnosticFloatingWarn = { fg = c.diagnostic_warning, bg = c.popup_warning_bg },
	DiagnosticFloatingInfo = { fg = c.diagnostic_info, bg = c.popup_info_bg },
	DiagnosticFloatingHint = { fg = c.diagnostic_hint, bg = c.popup_hint_bg },

	DiagnosticSignError = { fg = c.diagnostic_error },
	DiagnosticSignHint = { fg = c.diagnostic_hint },
	DiagnosticSignInfo = { fg = c.diagnostic_info },
	DiagnosticSignWarn = { fg = c.diagnostic_warning },
	LineNr = { fg = c.dimmed, italic = true },
	IndentLine = { fg = "#ffffff" },
	IndentLineCurrent = { fg = c.dimmed },
	TreesitterContext = { reverse = true },
	TreesitterContextLineNumber = { bg = c.dimmed, reverse = true, italic = true },
	InclineNormal = { bg = c.background },
	InclineNormalNC = { bg = c.background },

	WinSeparator = { bg = c.dialog_bg },
	NormalFloat = { bg = c.dialog_bg },
	Title = { fg = c.foreground, bold = true },

	TelescopeNormal = { fg = c.foreground, bg = c.background },
	TelescopeBorder = { bold = true },
	TelescopeSelection = { reverse = true },
	TelescopeResultsComment = { fg = c.foreground, italic = true },

	Visual = { bg = c.selection },
}

vim.cmd("hi clear")

if vim.fn.exists("syntax_on") == 1 then
	vim.cmd("syntax reset")
end

for group, hl in pairs(theme) do
	vim.api.nvim_set_hl(0, group, hl)
end

vim.g.colors_name = "dieter"