local awful = require("awful")
local gears = require("gears")
local beautiful = require("beautiful")
local wibox = require("wibox")

local keys = require("config").keys
local theme = beautiful.get()
local dpi = beautiful.xresources.apply_dpi

local ll = awful.widget.layoutlist({
	base_layout = wibox.widget({
		spacing = dpi(5),
		forced_num_cols = dpi(4),
		layout = wibox.layout.grid.vertical,
	}),

	widget_template = {
		{
			{
				id = "icon_role",
				forced_height = dpi(1),
				forced_width = dpi(1),
				widget = wibox.widget.imagebox,
			},
			margins = dpi(15),
			widget = wibox.container.margin,
		},
		id = "background_role",
		forced_width = dpi(70),
		forced_height = dpi(70),
		shape = gears.shape.rounded_rect,
		widget = wibox.container.background,
	},
})

local layout_popup = awful.popup({
	widget = wibox.widget({
		ll,
		margins = 4, --border margins (padding)
		widget = wibox.container.margin,
	}),

	border_color = theme.border_normal,
	bg = theme.bg_normal,
	border_width = theme.border_width,
	placement = awful.placement.centered,
	ontop = true,
	visible = false,
	shape = gears.shape.rounded_rect,
})

function gears.table.iterate_value(t, value, step_size, filter, _)
	local k = gears.table.hasitem(t, value)
	if not k then
		return
	end

	step_size = step_size or 1
	local new_key = gears.math.cycle(#t, k + step_size)

	if filter and not filter(t[new_key]) then
		for i = 1, #t do
			local k2 = gears.math.cycle(#t, new_key + i)
			if filter(t[k2]) then
				return t[k2], k2
			end
		end

		return
	end

	return t[new_key], new_key
end

-- Timer for Death of PopUp
layout_popup.timer = gears.timer({
	timeout = 0.8,
	single_shot = true,
	callback = function()
		layout_popup.visible = false
	end,
})

function layout_popup.changed()
	layout_popup.visible = true
	if not layout_popup.visible then
		layout_popup.timer:start()
	else
		layout_popup.timer:again()
	end
end

-- Mouse Support
layout_popup:connect_signal("mouse::enter", function()
	layout_popup.timer:stop()
end)
layout_popup:connect_signal("mouse::leave", function()
	layout_popup.timer:start()
end)

awful.keygrabber({
	start_callback = function()
		layout_popup.visible = true
	end,

	stop_callback = function()
		layout_popup.visible = false
	end,

	export_keybindings = true,
	stop_event = "release",
	stop_key = { "Escape", "Super_L", "Super_R" },

	keybindings = {
		{
			{ keys.mod },
			" ",
			function()
				awful.layout.set(gears.table.iterate_value(ll.layouts, ll.current_layout, 1), layout_popup.changed())
			end,
		},

		{
			{ keys.mod, "Shift" },
			" ",
			function()
				awful.layout.set(gears.table.iterate_value(ll.layouts, ll.current_layout, -1), layout_popup.changed())
			end,
		},
	},
})