local path_ok, plenary_path = pcall(require, "plenary.path")
if not path_ok then
	return
end

local dashboard = require("alpha.themes.dashboard")
local cdir = vim.fn.getcwd()
local if_nil = vim.F.if_nil

local nvim_web_devicons = {
	enabled = true,
	highlight = true,
}

local function get_extension(fn)
	local match = fn:match("^.+(%..+)$")
	local ext = ""
	if match ~= nil then
		ext = match:sub(2)
	end
	return ext
end

local function icon(fn)
	local nwd = require("nvim-web-devicons")
	local ext = get_extension(fn)
	return nwd.get_icon(fn, ext, { default = true })
end

local function file_button(fn, sc, short_fn,autocd)
	short_fn = short_fn or fn
	local ico_txt
	local fb_hl = {}

	if nvim_web_devicons.enabled then
		local ico, hl = icon(fn)
		local hl_option_type = type(nvim_web_devicons.highlight)
		if hl_option_type == "boolean" then
			if hl and nvim_web_devicons.highlight then
				table.insert(fb_hl, { hl, 0, #ico })
			end
		end
		if hl_option_type == "string" then
			table.insert(fb_hl, { nvim_web_devicons.highlight, 0, #ico })
		end
		ico_txt = ico .. "  "
	else
		ico_txt = ""
	end
	local cd_cmd = (autocd and " | cd %:p:h" or "")
	local file_button_el = dashboard.button(sc, ico_txt .. short_fn, "<cmd>e " .. vim.fn.fnameescape(fn) .. cd_cmd .." <CR>")
	local fn_start = short_fn:match(".*[/\\]")
	if fn_start ~= nil then
		table.insert(fb_hl, { "Comment", #ico_txt - 2, #fn_start + #ico_txt })
	end
	file_button_el.opts.hl = fb_hl
	return file_button_el
end

local default_mru_ignore = { "gitcommit" }

local mru_opts = {
	ignore = function(path, ext)
		return (string.find(path, "COMMIT_EDITMSG")) or (vim.tbl_contains(default_mru_ignore, ext))
	end,
	autocd = false
}

--- @param start number
--- @param cwd string? optional
--- @param items_number number? optional number of items to generate, default = 10
local function mru(start, cwd, items_number, opts)
	opts = opts or mru_opts
	items_number = if_nil(items_number, 10)

	local oldfiles = {}
	for _, v in pairs(vim.v.oldfiles) do
		if #oldfiles == items_number then
			break
		end
		local cwd_cond
		if not cwd then
			cwd_cond = true
		else
			cwd_cond = vim.startswith(v, cwd)
		end
		local ignore = (opts.ignore and opts.ignore(v, get_extension(v))) or false
		if (vim.fn.filereadable(v) == 1) and cwd_cond and not ignore then
			oldfiles[#oldfiles + 1] = v
		end
	end
	local target_width = 35

	local tbl = {}
	for i, fn in ipairs(oldfiles) do
		local short_fn
		if cwd then
			short_fn = vim.fn.fnamemodify(fn, ":.")
		else
			short_fn = vim.fn.fnamemodify(fn, ":~")
		end

		if #short_fn > target_width then
			short_fn = plenary_path.new(short_fn):shorten(1, { -2, -1 })
			if #short_fn > target_width then
				short_fn = plenary_path.new(short_fn):shorten(1, { -1 })
			end
		end

		local shortcut = tostring(i + start - 1)

		local file_button_el = file_button(fn, shortcut, short_fn,opts.autocd)
		tbl[i] = file_button_el
	end
	return {
		type = "group",
		val = tbl,
		opts = {},
	}
end

local cats = {
	{
		[[	,-.	   _,---._ __  / \]],
		[[ /  )	.-'	   `./ /   \]],
		[[(  (   ,'			`/	/|]],
		[[ \  `-"			 \'\   / |]],
		[[  `.			  ,  \ \ /  |]],
		[[   /`.		  ,'-`----Y   |]],
		[[  (			;		|   ']],
		[[  |  ,-.	,-'		 |  /]],
		[[  |  | (   |		hjw | /]],
		[[  )  |  \  `.___________|/]],
		[[  `--'   `--']],
	},
	{
		[[		 _]],
		[[	   \`*-.	 ]],
		[[		)  _`-.	 ]],
		[[	   .  : `. .	   ]],
		[[	   : _   '  \		 ]],
		[[	   ; *` _.   `*-._	   ]],
		[[	   `-.-'		  `-.	   ]],
		[[		 ;	   `	   `.	 ]],
		[[		 :.	   .		\	]],
		[[		 . \  .   :   .-'   .   ]],
		[[		 '  `+.;  ;  '	  :   ]],
		[[		 :  '  |	;	   ;-. ]],
		[[		 ; '   : :`-:	 _.`* ;]],
		[[[bug] .*' /  .*' ; .*`- +'  `*' ]],
		[[	  `*-*   `*-*  `*-*']],
  },
}

math.randomseed(os.time())
local header = {
	type = "text",
	val = cats[math.random(1, #cats)],
	opts = {
		position = "center",
		hl = "Type",
	},
}

local section_mru = {
	type = "group",
	val = {
		{
			type = "text",
			val = "Recent files",
			opts = {
				hl = "SpecialComment",
				shrink_margin = false,
				position = "center",
			},
		},
		{ type = "padding", val = 1 },
		{
			type = "group",
			val = function()
				return { mru(0, cdir) }
			end,
			opts = { shrink_margin = false },
		},
	},
}

local buttons = {
	type = "group",
	val = {
		{ type = "text", val = "Quick links", opts = { hl = "SpecialComment", position = "center" } },
		{ type = "padding", val = 1 },
		dashboard.button("e", "  New file", "<cmd>ene<CR>"),
		dashboard.button("SPC f f", "󰈞  Find file"),
		dashboard.button("SPC f g", "󰊄  Live grep"),
		dashboard.button("SPC p", "  Update plugins", "<cmd>PlugUpdate<CR>"),
		dashboard.button("c", "  Configuration", "<cmd>cd ~/.config/nvim/ <CR>"),
		dashboard.button("q", "󰅚  Quit", "<cmd>qa<CR>"),
	},
	position = "center",
}

local config = {
	layout = {
		{ type = "padding", val = 2 },
		header,
		{ type = "padding", val = 2 },
		section_mru,
		{ type = "padding", val = 2 },
		buttons,
	},
	opts = {
		margin = 5,
		setup = function()
			vim.api.nvim_create_autocmd('DirChanged', {
				pattern = '*',
				group = "alpha_temp",
				callback = function () require('alpha').redraw() end,
			})
		end,
	},
}

return {
	header = header,
	buttons = buttons,
	mru = mru,
	config = config,
	-- theme specific config
	mru_opts = mru_opts,
	leader = dashboard.leader,
	nvim_web_devicons = nvim_web_devicons,
}