-- Clone 'mini.nvim' manually in a way that it gets managed by 'mini.deps'
local path_package = vim.fn.stdpath('data') .. '/site/'
local mini_path = path_package .. 'pack/deps/start/mini.nvim'
if not (vim.uv or vim.loop).fs_stat(mini_path) then
	vim.cmd('echo "Installing [`mini.nvim`](../doc/mini-nvim.qmd#mini.nvim)" | redraw')
	local clone_cmd = {
		'git', 'clone', '--filter=blob:none',
		'https://github.com/nvim-mini/mini.nvim', mini_path
	}
	vim.fn.system(clone_cmd)
	vim.cmd('packadd mini.nvim | helptags ALL')
	vim.cmd('echo "Installed [`mini.nvim`](../doc/mini-nvim.qmd#mini.nvim)" | redraw')
end
require('mini.deps').setup({ path = { package = path_package } })

require('mini.ai').setup()        -- enhances the use of a/i textobjects
require('mini.align').setup()     -- utility to align text in various ways
require('mini.comment').setup()   -- for toggling comments inline
require('mini.move').setup()      -- moving lines
require('mini.operators').setup() -- duplicating lines and evaluating equations inline
require('mini.pairs').setup()     -- automatic closing pairs
require('mini.surround').setup()  -- surround stuff
require('mini.clue').setup({      -- shows available keybinds when performing keybind actions
	window = { delay = 50 },
	triggers = {
		-- Leader triggers
		{ mode = 'n', keys = '<Leader>' },
		{ mode = 'x', keys = '<Leader>' },

		-- Built-in completion
		{ mode = 'i', keys = '<C-x>' },

		-- `g` key
		{ mode = 'n', keys = 'g' },
		{ mode = 'x', keys = 'g' },

		-- Marks
		{ mode = 'n', keys = "'" },
		{ mode = 'n', keys = '`' },
		{ mode = 'x', keys = "'" },
		{ mode = 'x', keys = '`' },

		-- Registers
		{ mode = 'n', keys = '"' },
		{ mode = 'x', keys = '"' },
		{ mode = 'i', keys = '<C-r>' },
		{ mode = 'c', keys = '<C-r>' },

		-- Window commands
		{ mode = 'n', keys = '<C-w>' },

		-- `z` key
		{ mode = 'n', keys = 'z' },
		{ mode = 'x', keys = 'z' },
	},

	clues = {
		-- Enhance this by adding descriptions for <Leader> mapping groups
		require('mini.clue').gen_clues.builtin_completion(),
		require('mini.clue').gen_clues.g(),
		require('mini.clue').gen_clues.marks(),
		require('mini.clue').gen_clues.registers(),
		require('mini.clue').gen_clues.windows(),
		require('mini.clue').gen_clues.z(),
	},
})
require('mini.diff').setup({ -- shows git diffs in the file
	view = {
		style = 'sign',
	}
})
require('mini.files').setup()      -- file browser
Map('n', '<leader>o', MiniFiles.open, { desc = "Open mini file browser" })
require('mini.jump').setup()       -- extends f,F,t,T to work across multiple lines
require('mini.cursorword').setup() -- highlight words beneath the cursor
require('mini.icons').setup()
require('mini.indentscope').setup({
	draw = {
		delay = 50, -- delay in MS before writing the indicator
		animation = require('mini.indentscope').gen_animation.none(),
	},
})
MiniDeps.later(function()
	vim.api.nvim_set_hl(0, 'MiniIndentscopeSymbol', { link = 'Whitespace' })
end)
-- TODO: show history
require('mini.notify').setup() -- has more noticeable / utilitarian / aesthetically pleasing notifications

-- Custom `^V` and `^S` symbols to make this file appropriate for copy-paste
-- (otherwise those symbols are not displayed).
local CTRL_S = vim.api.nvim_replace_termcodes('<C-S>', true, true, true)
local CTRL_V = vim.api.nvim_replace_termcodes('<C-V>', true, true, true)
local modes  = setmetatable({
	['n']    = { long = 'NORMAL', short = 'N', hl = 'MiniStatuslineModeNormal' },
	['v']    = { long = 'VISUAL', short = 'V', hl = 'MiniStatuslineModeVisual' },
	['V']    = { long = 'V-LINE', short = 'V-L', hl = 'MiniStatuslineModeVisual' },
	[CTRL_V] = { long = 'V-BLOCK', short = 'V-B', hl = 'MiniStatuslineModeVisual' },
	['s']    = { long = 'SELECT', short = 'S', hl = 'MiniStatuslineModeVisual' },
	['S']    = { long = 'S-LINE', short = 'S-L', hl = 'MiniStatuslineModeVisual' },
	[CTRL_S] = { long = 'S-BLOCK', short = 'S-B', hl = 'MiniStatuslineModeVisual' },
	['i']    = { long = 'INSERT', short = 'I', hl = 'MiniStatuslineModeInsert' },
	['R']    = { long = 'REPLACE', short = 'R', hl = 'MiniStatuslineModeReplace' },
	['c']    = { long = 'COMMAND', short = 'C', hl = 'MiniStatuslineModeCommand' },
	['r']    = { long = 'PROMPT', short = 'P', hl = 'MiniStatuslineModeOther' },
	['!']    = { long = 'SHELL', short = 'Sh', hl = 'MiniStatuslineModeOther' },
	['t']    = { long = 'TERMINAL', short = 'T', hl = 'MiniStatuslineModeOther' },
}, {
	-- By default return 'Unknown' but this shouldn't be needed
	__index = function()
		return { long = 'Unknown', short = 'U', hl = '%#MiniStatuslineModeOther#' }
	end,
})
require('mini.statusline').setup({
	content = {
		active = function()
			local mode_info   = modes[vim.fn.mode()]
			local mode        = MiniStatusline.is_truncated(120) and mode_info.short or mode_info.long
			local mode_hl     = mode_info.hl
			local git         = MiniStatusline.section_git({ trunc_width = 40 })
			local diff        = MiniStatusline.section_diff({ trunc_width = 75 })
			local diagnostics = MiniStatusline.section_diagnostics({ trunc_width = 75 })
			local lsp         = MiniStatusline.section_lsp({ trunc_width = 75 })
			local filename    = MiniStatusline.section_filename({ trunc_width = 140 })
			local fileinfo    = MiniStatusline.section_fileinfo({ trunc_width = 120 })

			return MiniStatusline.combine_groups({
				{ hl = mode_hl,                 strings = { mode } },
				{ hl = 'MiniStatuslineDevinfo', strings = { git, diff, diagnostics, lsp } },
				'%<', -- general truncation point
				{ hl = 'MiniStatuslineFilename', strings = { filename } },
				'%=', -- align right
				{ hl = 'MiniStatuslineFileInfo', strings = { fileinfo } },
				{ hl = mode_hl,                  strings = { '%3l:%-3c' } }
			})
		end,
		inactive = function()
			return MiniStatusline.combine_groups({
				{},
			})
		end
	},
	use_icons = true,
	set_vim_settings = true,
})
require('mini.tabline').setup()    -- shows buffers that are open
require('mini.trailspace').setup() -- trailing space indication and removal.

---@module 'lazy'
---@type LazySpec
return {}
