local function project_files()
	require("telescope.builtin").find_files({
		cwd = require("lspconfig.util").root_pattern(".git")(vim.fn.expand("%:p")),
	})
end

local M = {
	"nvim-telescope/telescope.nvim",
	lazy = false,
	dependencies = {
		"nvim-lua/popup.nvim",
		"nvim-lua/plenary.nvim",
		"nvim-telescope/telescope-fzy-native.nvim",
		"nvim-telescope/telescope-github.nvim",
		"nvim-telescope/telescope-dap.nvim",
		"nvim-telescope/telescope-ui-select.nvim",
	},
}

function M.config()
	local telescope = require("telescope")
	local actions = require("telescope.actions")
	local previewers = require("telescope.previewers")

	vim.keymap.set("n", "<leader>b", '<cmd>lua require("telescope.builtin").buffers()<CR>')
	vim.keymap.set("n", "<leader>f", '<cmd>lua require("telescope.builtin").oldfiles()<CR>')
	vim.keymap.set("n", "<space>", '<cmd>lua require("telescope.builtin").oldfiles()<CR>')
	vim.keymap.set("n", "<leader><space>", '<cmd>lua require("telescope.builtin").oldfiles({cwd_only=true})<CR>')
	vim.keymap.set("n", "<leader>d", '<cmd>lua require("telescope.builtin").diagnostics({bufnr=0})<CR>')
	vim.keymap.set("n", "<leader>e", '<cmd>lua require("telescope.builtin").git_files()<CR>')
	vim.keymap.set("n", "<leader>g", '<cmd>lua require("telescope.builtin").git_status()<CR>')
	vim.keymap.set("n", "<leader>a", '<cmd>lua require("telescope.builtin").lsp_code_actions()<CR>')
	vim.keymap.set("n", "<leader>m", '<cmd>lua require("telescope.builtin").marks()<CR>')
	vim.keymap.set("n", "<leader>s", '<cmd>lua require("telescope.builtin").lsp_document_symbols()<CR>')
	vim.keymap.set("n", "<leader>t", '<cmd>lua require("telescope.builtin").treesitter()<CR>')
	vim.keymap.set("n", "<leader>/", '<cmd>lua require("telescope.builtin").live_grep()<CR>')
	vim.keymap.set("n", "<leader>.", '<cmd>lua require("telescope.builtin").file_browser()<CR>')
	vim.keymap.set("n", "<leader>p", '<cmd>lua require("telescope.builtin").registers()<CR>')
	vim.keymap.set("n", "ga", "<cmd>lua vim.lsp.buf.code_action()<CR>")
	vim.keymap.set("n", "gr", '<cmd>lua require("telescope.builtin").lsp_references()<CR>')
	vim.keymap.set("n", "gd", '<cmd>lua require("telescope.builtin").lsp_definitions()<CR>')
	vim.keymap.set("n", "g/", '<cmd>lua require("telescope.builtin").lsp_document_symbols()<CR>')
	vim.keymap.set(
		"n",
		"g?",
		'<cmd>lua require("telescope.builtin").lsp_workspace_symbols({query=(vim.bo.filetype == "go" and "\'" or "")})<CR>'
	)
	vim.keymap.set("n", "ge", '<cmd>lua require("telescope.builtin").lsp_document_diagnostics()<CR>')
	vim.keymap.set("n", "Db", '<cmd>lua require("telescope").extensions.dap.list_breakpoints()<CR>')
	vim.keymap.set("n", "Dcc", '<cmd>lua require("telescope").extensions.dap.commands()<CR>')
	vim.keymap.set("n", "Df", '<cmd>lua require("telescope").extensions.dap.frames()<CR>')
	vim.keymap.set("n", "Dv", '<cmd>lua require("telescope").extensions.dap.variables()<CR>')

	-- Setup
	telescope.setup({
		defaults = {
			layout_strategy = "flex",
			-- layout_defaults = {flip_columns = 160},
			layout_config = {
				preview_cutoff = 10,
				prompt_position = "bottom",
				mirror = true,
			},
			mappings = {
				i = {
					["<CR>"] = actions.select_default + actions.center,
					["<esc>"] = actions.close,
					["<tab>"] = actions.add_selection,
				},
			},
			color_devicons = true,
			file_previewer = previewers.vim_buffer_cat.new,
			grep_previewer = previewers.vim_buffer_vimgrep.new,
			qflist_previewer = previewers.vim_buffer_qflist.new,
		},
		extensions = {
			["ui-select"] = {
				require("telescope.themes").get_dropdown({
					-- even more opts
				}),
			},
		},
	})

	local layout_strategies = require("telescope.pickers.layout_strategies")
	local config = require("telescope.config")

	layout_strategies.flex = function(self, max_columns, max_lines)
		local layout_config = self.layout_config or {}

		local flip_columns = layout_config.flip_columns or 160 -- Here's why.
		local flip_lines = layout_config.flip_lines or 20

		if max_columns < flip_columns and max_lines > flip_lines then
			self.layout_config = (config.values.layout_defaults or {})["vertical"]
			return layout_strategies.vertical(self, max_columns, max_lines)
		else
			self.layout_config = (config.values.layout_defaults or {})["horizontal"]
			return layout_strategies.horizontal(self, max_columns, max_lines)
		end
	end

	-- Extensions
	telescope.load_extension("dap")
	telescope.load_extension("fzy_native")
	telescope.load_extension("gh")
	telescope.load_extension("ui-select")
end

return M