-- gitsigns.nvim
--- Displays git changes in the sidebar, configurably and efficiently.
--- See `:help gitsigns`
return {
	'lewis6991/gitsigns.nvim',
	commit = '9b36d497495436c135659902054ee637e0ba6021',
	event = 'VeryLazy',
	lazy = false,
	-- See: https://github.com/lewis6991/gitsigns.nvim/issues/796

	opts = {
		numhl = true,

		on_attach = function(buf)
			-- Hunk Navigation
			vim.keymap.set('n', ']g', function()
				if vim.wo.diff then
					vim.cmd.normal({ ']c', bang = true })
				else
					require('gitsigns').nav_hunk('next')
				end
			end, { buffer = buf, desc = 'Next [G]it Change' })
			vim.keymap.set('n', '[g', function()
				if vim.wo.diff then
					vim.cmd.normal({ '[c', bang = true })
				else
					require('gitsigns').nav_hunk('prev')
				end
			end, { buffer = buf, desc = 'Prev [G]it Change' })

			-- Hunk Preview
			vim.keymap.set('n', '<leader>gp', function()
				require('gitsigns').preview_hunk()
			end, { buffer = buf, desc = '[G]it [P]review Hunk' })

			-- Buffer Staging / Unstaging
			vim.keymap.set('n', '<leader>gs', function()
				require('gitsigns').stage_buffer()
			end, { buffer = buf, desc = '[G]it [S]tage Buffer' })
			vim.keymap.set('n', '<leader>gS', function()
				require('gitsigns').reset_buffer_index()
			end, { buffer = buf, desc = '[G]it Unstage Buffer' })

			-- Hunk Staging
			vim.keymap.set('n', '<leader>gh', function()
				require('gitsigns').stage_hunk()
			end, { buffer = buf, desc = '[G]it Hunk [S]tage Toggle' })

			-- Restoration
			vim.keymap.set('n', '<leader>gr', function()
				require('gitsigns').reset_hunk()
			end, { buffer = buf, desc = '[G]it [R]estore Hunk' })
			vim.keymap.set('n', '<leader>gR', function()
				local choice = vim.fn.confirm('Delete all unstaged changes in this buffer?', '&Yes\n&No', 2)
				if choice == 1 then
					require('gitsigns').reset_buffer()
				end
			end, { buffer = buf, desc = '[G]it [R]estore Buffer' })

			vim.keymap.set('n', '<leader>ga', function()
				require('gitsigns').toggle_linehl()
				require('gitsigns').toggle_word_diff()
			end, { buffer = buf, desc = '[G]it [A]nalysis Toggle' })

			-- TODO: Shortcut for opening lazygit in a new :term.
			--- Perhaps even in a new tab?
		end,
	},
}