--[[ CONFIG ]]--

-- global config for iris configuration
config = {
	-- colorscheme for nvim
	colorscheme = "catppuccin",
	flavour = "mocha",
	-- indentation
	tab_width = 4,
	expand_tab = false,
	-- keybinds to be set to actions
	keybinds = {
		-- leader key
		leader = ' ',
		-- toggle menus
		menus = {
			-- file browser
			browser = '<leader>e',
			-- active buffers
			buffers = '<leader>fb',
			-- error list
			error = '<leader>t',
			-- find files
			find = '<leader>ff',
			-- grep files
			grep = '<leader>fg',
			-- help browser
			help = '<leader>fh',
			-- undo tree
			undo = '<leader>u',
		},
		-- lsp actions
		lsp = {
			hover = 'K',
			action = '<leader>la',
			references = '<leader>lr',
			rename = '<leader>ln',
		},
		-- completion
		cmp = {
			-- prev item
			prev = '<C-p>',
			-- next item
			next = '<C-n>',
			-- confirm
			confirm = '<CR>',
			-- complete
			complete = '<C-Space>',
		},
		-- disable active selection
		noh = '<leader>h',
	},
	-- treesitter languages
	treesitter = {
		"c",
		"lua",
		"rust",
		"typescript",
		"javascript",
		"python",
		"vim",
		"vimdoc",
		"query",
	},
	-- lsp servers
	lsps = {
		-- rust
		rust_analyzer = {},
		-- c / c++
		clangd = {},
		-- java
		jdtls = {},
	},
};

vim.call('iris#load')

--[[ IMPORTS ]]--

local catppuccin = require('catppuccin')

--[[ VIM ]]--

vim.opt.tabstop = config.tab_width
vim.opt.softtabstop = config.tab_width
vim.opt.shiftwidth = config.tab_width
vim.opt.expandtab = config.expand_tab
vim.opt.mouse = "a"
vim.opt.clipboard = "unnamedplus"
vim.opt.hlsearch = true
vim.opt.autoindent = true
vim.opt.ttyfast = true
vim.opt.number = true
vim.opt.relativenumber = true
vim.opt.rnu = true
vim.opt.swapfile = false
vim.opt.termguicolors = true

-- remove trailing whitespace on save
vim.api.nvim_create_autocmd({ "BufWritePre" }, {
	pattern = { "*" },
	command = [[%s/\s\+$//e]],
})

--[[ THEME ]]--

catppuccin.setup({
	flavour = config.flavour,
	transparent_background = true,
	integrations = {
		cmp = true,
		illuminate = {
			enabled = true,
			lsp = false
		},
		nvimtree = true,
		nvim_surround = true,
		lsp_trouble = true,
		telescope = {
			enabled = true,
		},
		treesitter = true,
	},
})

vim.cmd('colorscheme ' .. config.colorscheme)
vim.o.background = "dark"
vim.api.nvim_set_hl(0, "Normal", { bg = "none" })
vim.api.nvim_set_hl(0, "NormalFloat", { bg = "none" })
vim.api.nvim_set_hl(0, "NvimTreeNormal", { bg = "none" })

--[[ LINES ]]--

-- mode line
require('lualine').setup {
	options = {
		theme = config.colorscheme,
		icons_enabled = true,
		globalstatus = true,
	},
}

-- buffer line
require("bufferline").setup {}

--[[ MENUS ]]--

-- file browser
vim.g.loaded_netrw = 1
vim.g.loaded_netrwPlugin = 1
vim.opt.termguicolors = true

require("nvim-tree").setup {
	sort = {
		sorter = "case_sensitive",
	},
	view = {
		width = 30,
	},
	renderer = {
		group_empty = true,
	},
	actions = {
		open_file = {
			quit_on_open = true,
		},
	},
	filters = {
		dotfiles = false,
	},
}

--[[ COMPLETION ]]--

-- completion engine
--local cmp = require('cmp')
--
--local cmp_select = {behavior = cmp.SelectBehavior.Select}
--local cmp_mappings = cmp.mapping.preset.insert({
--	[config.keybinds.cmp.prev] = cmp.mapping.select_prev_item(cmp_select),
--	[config.keybinds.cmp.next] = cmp.mapping.select_next_item(cmp_select),
--	[config.keybinds.cmp.confirm] = cmp.mapping.confirm({ select = true }),
--	[config.keybinds.cmp.complete] = cmp.mapping.complete(),
--})
--
--cmp_mappings['<Tab>'] = nil
--cmp_mappings['<S-Tab>'] = nil
--
--cmp.setup {
--	snippet = {
--		expand = function(args)
--			vim.fn["vsnip#anonymous"](args.body)
--		end,
--	},
--	sources = cmp.config.sources({
--		{ name = 'nvim_lsp' },
--		{ name = 'vsnip' },
--		{ name = 'buffer' },
--	}),
--	mapping = cmp_mappings,
--}
--
-- delimiter completion
require'nvim-surround'.setup {}

--[[ LSP ]]--

local capabilities = require'cmp_nvim_lsp'.default_capabilities()
for lsp,config in pairs(config.lsps) do
	config.capabilities = capabilities
	require'lspconfig'[lsp].setup(config)
end

-- treesitter
require'nvim-treesitter.configs'.setup {
	ensure_installed = config.treesitter,
	sync_install = false,
	auto_install = true,
	highlight = {
		enable = true,
		additional_vim_regex_highlighting = false,
	},
	indent = {
		enable = true
	},
}

-- illuminate
require'illuminate'.configure {
	providers = {
		'lsp',
		'treesitter',
		'regex',
	},
}

-- todo comments
require('todo-comments').setup()

-- auto indentation
require('indent-o-matic').setup {
	max_lines = 2048,
	standard_widths = { 2, 4, 8 },
	skip_multiline = true,
}

-- image viewer
--require'hologram'.setup {
--	auto_display = true
--}

-- 80 col bar
require'virt-column'.setup {
	enabled = true,
	virtcolumn = "80"
}

-- notifications
require("fidget").setup {
	notification = {
		window = {
			winblend = 0,
		},
	},
}

--[[ KEYBINDS ]]--

vim.g.mapleader = config.keybinds.leader
vim.g.maplocalleader = config.keybinds.leader
vim.keymap.set('', '<leader>', '<Nop>', { noremap = true, silent = true })

local function bind(key, action, opts)
	opts = opts or {}
	vim.keymap.set('n', key, action, opts)
end

bind(config.keybinds.noh, vim.cmd.noh)
bind(config.keybinds.menus.browser, vim.cmd.NvimTreeToggle)
bind(config.keybinds.menus.undo, vim.cmd.UndotreeToggle)
bind(config.keybinds.menus.error, function() require'trouble'.toggle() end)

local telescope = require'telescope.builtin'
bind(config.keybinds.menus.buffers, telescope.buffers)
bind(config.keybinds.menus.find, telescope.find_files)
bind(config.keybinds.menus.grep, telescope.live_grep)
bind(config.keybinds.menus.help, telescope.help_tags)

vim.api.nvim_create_autocmd('LspAttach', {
	desc = 'LSP actions',
	callback = function(event)
		local opts = {buffer = event.buf}
		bind(config.keybinds.lsp.hover, function() vim.lsp.buf.hover() end, opts)
		bind(config.keybinds.lsp.action, function() vim.lsp.buf.code_action() end, opts)
		bind(config.keybinds.lsp.references, function() vim.lsp.buf.references() end, opts)
		bind(config.keybinds.lsp.rename, function() vim.lsp.buf.rename() end, opts)
	end
})